Redis快速入门①

如有侵权立马删除!!!!!!!!!! 一、Redis入门课程介绍d53faf57a96d4d99a2d57891bdc12a11.png 不仅有json这样字符串还有,List集合、哈希表....

NoSQL数据库

5ee4699f226d4ab2928eecaa5f17f461.png二、初识Redis-认识NoSQL1582073862cb49d0bd9e89d3a3494dc1.png4fa29f28fabb4bdf855400417c342180.png1.SQL 与 NoSQL 的区别 02975c05d0e74682a8c7d30c69847b1a.png 1.结构化(约束) / 非结构化

166e04bfcdfe4c8084d76bb2e2d0a143.png 2. 关联的 (外键) / 非关联的(嵌套,重复)

b5c0bda480bb46de8f6bb45c5a9a7309.png0a360d0481334dea96c2e756d923f46c.png 3. SQL 查询 / 非SQL (每一个库要学不同的语法)

fb271a751ada4ed59ade9b313f0966b9.png 4.事务方面: ACID(原子性、一致性、隔离性,持久性) / BASE (无事务,基本满足)

7de8cb46d86149b381abea36b2228d60.png 如果对数据安全性要求较高,要满足ACID。此时应该选择SQL型数据库,而不是NoSQL。

三、 初识Redis-认识Redis003a53b74e604b77afbcf01db3a6398f.png四、 初识Redis-安装Redis单机安装Redis安装Redis依赖 Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:

代码语言:javascript代码运行次数:0运行复制yum install -y gcc tcl上传安装包并解压编译并安装 然后将Redis安装包上传

我放到了/usr/local/src 目录:

这个目录一般情况下都是放我们的安装文件。

133942c068a54b8e8079d0df9b17e36c.png代码语言:javascript代码运行次数:0运行复制tar -xzf redis-6.2.6.tar.gz 解压后:进入redis目录

代码语言:javascript代码运行次数:0运行复制cd redis-6.2.6 运行编译 并 安装 命令

代码语言:javascript代码运行次数:0运行复制make && make install 如果没有出错,应该就安装成功了。

93f7430734dc4b5ba2c5280718b79128.png检查是否安装成功(安装目录)默认的安装路径是在 `/usr/local/bin`目录下:

代码语言:javascript代码运行次数:0运行复制cd /usr/local/bin 该目录以及默认配置到环境变量,因此可以在任意目录下运行这些命令。其中:

- redis-cli:是redis提供的命令行客户端

- redis-server:是redis的服务端启动脚本

- redis-sentinel:是redis的哨兵启动脚本

启动 redis的启动方式有很多种,例如:

- 默认启动

- 指定配置启动

- 开机自启

1.默认启动 安装完成后,在任意目录输入redis-server命令即可启动Redis:

这种启动属于`前台启动`,会阻塞整个会话窗口,窗口关闭或者按下`CTRL + C`则Redis停止。不推荐使用。

代码语言:javascript代码运行次数:0运行复制redis-server071fc470828c48088d8ecdd563d56de4.png redis启动成功。

2.指定配置启动(通过配置文件启动) 如果要让Redis以`后台`方式启动,则必须修改Redis配置文件,就在我们之前解压的redis安装包下(`/usr/local/src/redis-6.2.6`),名字叫redis.conf:

我们先将这个配置文件备份一份:

进入目录

代码语言:javascript代码运行次数:0运行复制cd /usr/local/src/redis-6.2.6备份

代码语言:javascript代码运行次数:0运行复制cp redis.conf redis.conf.bck修改redis.conf文件中的一些配置:(/name快速搜索文档内容)代码语言:javascript代码运行次数:0运行复制vi redis.conf①允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不要设置为0.0.0.0

bind 0.0.0.0

d6a091379b1c4022862758816806c042.png②守护进程,修改为yes后即可后台运行

daemonize yes

22adc90ff3bb434ba28faa9fd94dcead.png③密码,设置后访问Redis必须输入密码

requirepass qyy2001

e7e4616b422844c381f024948074c48a.pngRedis的其它常见配置:监听的端口

port 6379

工作目录,默认是当前目录,也就是运行redis-server时的命令,日志、持久化等文件会保存在这个目录

dir .

数据库数量,设置为1,代表只使用1个库,默认有16个库,编号0~15

databases 1

设置redis能够使用的最大内存

maxmemory 512mb

日志文件,默认为空,不记录日志,可以指定日志文件名

logfile "redis.log"

后台启动)启动Redis:进入redis安装目录

cd /usr/local/src/redis-6.2.6

启动

redis-server redis.conf

查看启动的进程

ps -ef | grep redis

停止服务 可以直接杀死进程

ps -ef | grep redis

0bb46ca2fbaa423080e07d816f1542a8.png kill -9 402368

3.开机自启(推荐)我们也可以通过配置来实现开机自启。

首先,新建一个系统服务文件:

vi /etc/systemd/system/redis.service

内容如下:

[Unit]

Description=redis-server

After=network.target

[Service]

Type=forking

ExecStart=/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf

PrivateTmp=true

[Install]

WantedBy=multi-user.target

然后重载系统服务:

systemctl daemon-reload

77a9727a050f42c7acebd5c0017e9763.png现在,我们可以用下面这组命令来操作redis了:

启动

systemctl start redis

停止

systemctl stop redis

重启

systemctl restart redis

查看状态

systemctl status redis

执行下面的命令,可以让redis开机自启:

systemctl enable redis

2ba2e99e352e43a994b116b26ac85e19.png五、redis命令行客户端 Redis安装完成后就自带了命令行客户端:redis-cli,使用方式如下:

redis-cli [options] [commonds]

常见的options有: -h 127.0.0.1:指定要连接的redis节点的IP地址,默认是127.0.0.1

这也可以省略不写,那么就是默认值。

外部连接

通过服务器的主机地址进行连接,这就和之前的配置文件有关系了,并且还和服务器的安全组、防火墙有关系。一定要开放6379这个端口号。否则连接不成功。

我的主机地址:113.44.83.92

-p 6379:指定要连接的redis节点的端口,默认是6379.这也可以省略不写,那么就是默认值。

-a qyy2001:指定redis的访问密码(不过我们一般不在这里指定。)

commonds就是Redis的操作命令,例如:

ping:与redis服务端做心跳测试,服务端正常会返回pong

74b6bbf66ac44e20bfe0500e23872c2b.png不指定commond时,会

进入 redis-cli 的交互控制台:053d91bd89e94a5294024cdfe510df35.png 基本操作(重点)

1.先连接上redis。进入 redis-cli 的交互控制台:(默认是通过本机地址进行连接)

redis-cli

1b3cd83613714e5d8c79ac93d64044c0.png也可以指定服务器地址连接

redis-cli -h 113.44.83.92

a8b075207fdb4873a8b52b4c018228d6.png 2.通过auth命令指定用户名和密码,用户名可选。此时没有用户名

auth qyy2001

aa748a2a6b924dbf8a9a2e2bcbd1352f.png3.ping 输出 pong代表连接成功

ping

a1b80a2dda7749a5b41ad70cf33d2ebc.png4. 增:

set name java

向redis里面存了一个键值对了。key是name,value是java

dba3ae038b854df0ad13e2ba4192741a.png 5.取:

get name

0ac38f554c764e3ba369efbc063a2579.png42fc948fa59e406e9f87838a4f6e9b29.png六、redis的图形化界面客户端 这是大神编写的。

操作示例 2f6d1822509b4f31b5a2be246fdac804.png连接成功67fedac7d0544f2ea0943e5b2e5de8e4.png 如上图显示了 redis 默认的 16 个数据库

点击别的库,新建数据。就可以添加新的键值对。 然后保存。

8985031367ed4db7bfc101a0d335d8cc.png在服务器上面查找到这个数据

选库操作(命令) select 1

get name

e87f8227c30c4278945e8f1888c7e9b1.png如果连接不成功可以进行如下修改的测试。注意之前的配置文件也要修改

关闭防火墙命令 systemctl stop firewalld

开启防火墙命令 sudo systemctl start firewalld

添加防火墙规则允许 6379 端口第一步:添加防火墙规则允许 6379 端口(TCP 协议)通过

sudo firewall-cmd --permanent --add-port=6379/tcp

第二步:

重新加载防火墙配置,使新添加的规则生效

sudo firewall-cmd --reload

修改redis.conf配置文件禁用 protected-mode: protected-mode no

958b8a3b12b448f89d569343ab27f61e.png保存配置文件后,重启 Redis 服务: sudo systemctl restart redis

从外部机器测试连接:telnet安装命令 yum install telnet - y

使用 telnet进行测试 telnet 113.44.83.92 6379

也可以在服务器上面根据服务器地址进行连接尝试连接失败原因 安全组配置错误。

我有多个实例的安全组。但是关联实例的安全组只有一个。

而恰好这个安全组没有开放

6379

的端口号。随后我添加了之后就好了。

dbfd976c8b2f47ba9effc0d27bd90eed.png七、redis命令-数据结构介绍数据结构介绍46ccd1822a934f6780603ec857a5de63.png 还有别的类型,如消息队列。后面会说到

官方文档查看命令 命令忘了没关系,主要是要会查

官方文档

9a402423e53840eba460c94cac323295.png3e35f8aca2f14432be2a9aaddba8d9d8.png 命令行查看官方文档fa06d1697d354971821885996aa2278e.pnga55978b5ba9b49a5941a0aad2bec3ca5.png 比如看String

96c1a575e21e4696a38a5c00c2f80d1c.png八、redis命令-通用命令(@genertic)官方文档放在Keys这个目录里面

bccb39294293408c933c6e0f592b9c97.png7f9199e6a7c2421e982a08fc96c9c539.png32ae0b76a76c44709bfb98b5b288b876.png 模糊匹配查询效率不高。

九、redis命令-String类型4e3e2524324a4d0bbdc248d794a9c23e.png小结: 21dce906c04d4b159f85909388b9ccd1.png十、redis命令-Key的层级格式思考:如何区分不同类型的keyfc5e2484a5b24cf5b98de5ccb1c94293.pngKey的结构c406058adb9d452994c7e62380320954.png示例:764b5956583e4bd69a31084c7a028c5b.pngd083fa4faaa84e22bd8a8f4c4b5ed50c.png 以冒号隔开,形成层级结构7633422b40c44693af91567a80bd2f71.png总结:3241a7b85f1b4a779728761815de8b0c.png十一、redis命令-Hash类型当成java中的Map操作。

f161ac6c8f3748b5bd8b4d6bf0edad9a.png86094a830d5649e1b35e32aeed8e01a1.png 示例:HSETacf00163dd23479588fceb330a0e7b8f.pngea873c2196e0440ea62b023d767f2de6.pngHGET8990a0f111e041199c7ad4ff4fbb8445.png HMSET9d49aac073764ae6bac180ca3684fac6.png90bc3b5a075544ca88763d8320bcd7bf.pngHGETALL570f60a1e0ed43b4917efd01ea93bc49.pngHKEYS374b3b48febb483ba007a610c53ea571.pngHVALS 4976e01d8696432d84f55ba40f8a1cf2.pngHINCRBY8ceb0dab59c6463d9282b321dcadc254.png HSETNX77669ac1e99f47729cc1b8702713cb67.png小结:00ae200db1964094927281dc08e5cc26.png十二、redis命令-List类型00a278a84c5a46129eed9af09b1eee87.png374ab357f8c44cd2bc3a8455f7d84b33.png1c74e794483943f58ea6d98bfd22cc7f.pnglpush e104b3b2de54451aa3c550567dded913.png8cb01a91888440d0b24bde0d5357ded7.png357c7b7eab8b443a855d42c26b8bfdbd.pnglpoprpop2e0e4ec0053a4684bad6e04f903f1060.pnge8c8e147f63647e895889b279b1bad63.pnglrange10e699d55430498aa267324ed3fb3a30.png160b298a42ec4473b7d2efebc01479d0.pngblpope7c1211db4bb4da3874003516bf48c2b.png 阻塞式获取。 等100秒、如果拿不到就报错

1d68af9fcd1e41bfb93a57e83924d456.png 在另一半插入数据。最终拿到数据。返回了数据和阻塞时间

brpop 类似rpop

思考三连:如何用list结构模拟栈、队列、阻塞队列dcb7b2713a71429487fd42b6036ee05d.png十三、redis命令-Set类型c0ecbdb7778f4cde9199db96a76a826c.png0e5e869bc0f246e486229cd6945becfe.png对单个集合操作 sadd9d4943251c03433691ffc04c55d31d8f.pngsmembers57060170ef9c454492ea073d16c6ec9e.pngsremc75647f87d50482483269a38707bef07.pngsismemberdecc9748005646a58e27fa1d96fc1193.pngscard0107dfd226b249589063e1c59445728f.pngsinter交集sdiff差集sunion并集bf45357c20bb4826847cf5f4b483f89a.png案例练习 743c22c4c81e4b688f6dab382cdcc908.png将下列数据用Redis的Set集合来存储:

•张三的好友有:李四、王五、赵六

44c8cf2c2167474db2467104e841b7c6.png •李四的好友有:王五、麻子、二狗

57403cfaf77640aab93e6c98ae195c63.png利用Set的命令实现下列功能:

•计算张三的好友有几人

bd90722fa37e4f549d003b0f91f27dee.png •计算张三和李四有哪些共同好友

ee248b3551d34893b3315ffb307c86dc.png •查询哪些人是张三的好友却不是李四的好友

ea4da09e507e4ad799e4e2fa2811bee3.png •查询张三和李四的好友总共有哪些人

51afc9c58fcf45c78a26304a3c04050c.png •判断李四是否是张三的好友

adfaf7d5d8134352bc7153ff79b25553.png •判断张三是否是李四的好友

41b82f6a478044f5b1f5a8badde768d7.png •将李四从张三的好友列表中移除

e004a454e8514d09a7a0a1f6d95c5c24.png十四、redis命令-SortedSet类型7382063054c542a8ac3bca137113629d.png248536c5854a4659bc93b4ae7ea5dad2.png69db408639ae4d44942fbdc3ff166c57.png案例:SortedSet命令练习将班级的下列学生得分存入Redis的SortedSet中:Jack 85, Lucy 89, Rose 82, Tom 95, Jerry 78, Amy 92, Miles 76

12e46415be0540abbdb9977ceb89080f.png •并实现下列功能:

•删除Tom同学

42629e278d4a478387f1a45cbfc4fc2c.png •获取Amy同学的分数

zscore stus amy

•获取Rose同学的排名

5d9c295075994f508cc5186dbfe0a039.png •查询80分以下有几个学生

267960100abf479db7de6d2638cd9243.png •给Amy同学加2分

3e672a23c8e24a0784050e1d7094f107.png •查出成绩前3名的同学

14969725bd8041278bed60c17b90dab9.png •查出成绩80分以下的所有同学

280122ce114a4474b26a934516a0cc36.png十五、Redis的客户端-客户端对比6c3b91bcb76c4c4f9b236b59c932ec38.png0d8b81dc829c45ce923ff9fcfcbff0c9.png7c0878845f8d4ae5b88cbaab14384ac0.png 十六、Jedis快速入门Jedis的官网地址: https://github.com/redis/jedis,我们先来个快速入门:

87a7e93479d14857ae47be86f45c78c1.png1.引入依赖:(官网地址可以找到)jedis依赖

代码语言:javascript代码运行次数:0运行复制

redis.clients

jedis

5.2.0

单元测试

代码语言:javascript代码运行次数:0运行复制

org.junit.jupiter

junit-jupiter

5.7.0

test

2.建立连接 private Jedis jedis;

@BeforeEach

void setUp() {

// 建立连接

jedis = new Jedis("192.168.150.101", 6379);

// 设置密码

jedis.auth("123321");

// 选择库

jedis.select(0);

}

3.测试String @Test

void testString() {

// 插入数据,方法名称就是redis命令名称,非常简单

String result = jedis.set("name", "张三");

System.out.println("result = " + result);

// 获取数据

String name = jedis.get("name");

System.out.println("name = " + name);

}

4.释放资源 @AfterEach

void tearDown() {

// 释放资源

if (jedis != null) {

jedis.close();

}

}

4a57481d648a4e05ae4be482f07030a3.pngd6057471627847a9b62afba87e6c7fb5.png 小结d66c0de10e184821b7653772a02fdf7c.png十七、Jedis的连接池ec8fca227f544d0689d1f37999544992.png实现连接池的使用 public class JedisConnectionFactory {

private static final JedisPool jedisPool;

static {

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

// 最大连接

jedisPoolConfig.setMaxTotal(8);

// 最大空闲连接

jedisPoolConfig.setMaxIdle(8);

// 最小空闲连接

jedisPoolConfig.setMinIdle(0);

// 设置最长等待时间, ms

jedisPoolConfig.setMaxWaitMillis(200);

jedisPool = new JedisPool(jedisPoolConfig, "192.168.150.101", 6379,

1000, "123321");

}

// 获取Jedis对象

public static Jedis getJedis(){

return jedisPool.getResource();

}

}

从池子里获取连接 14c15846bce64362bb8446c7679ad3a1.png释放资源则会归还到连接池962477bfcea843ab943b90ef52dabe55.png 十八、认识SpringDataRedis4e30d1703e1746088c986a369621e51f.pngSpringDataRedis快速入门 f7de7b329dc64a7b90c036ad2a6ab04f.png1.引入依赖(Redis依赖,连接池依赖) SpringBoot已经提供了对SpringDataRedis的支持,使用非常简单:

org.springframework.boot

spring-boot-starter-data-redis

org.apache.commons

commons-pool2

2.配置文件 spring:

redis:

host: 192.168.150.101

port: 6379

password: 123321

lettuce:

pool:

max-active: 8 # 最大连接

max-idle: 8 # 最大空闲连接

min-idle: 0 # 最小空闲连接

max-wait: 100 # 连接等待时间

现在的配置文件需要在redis后面加上data才行

3.注入RedisTemplate @Autowired

private RedisTemplate redisTemplate;

4.编写测试 @SpringBootTest

public class RedisTest {

@Autowired

private RedisTemplate redisTemplate;

@Test

void testString() {

// 插入一条string类型数据

redisTemplate.opsForValue().set("name", "李四");

// 读取一条string类型数据

Object name = redisTemplate.opsForValue().get("name");

System.out.println("name = " + name);

}

}

示例: dd2aa25fa5a64da096ad17309c12913e.png 在数据库中get。我们会发现找不到虎哥,因为它被"剁碎了”

这就和序列化相关了。会将字符串转成字节。

下一节会讲到

fd2c488c59024d89aacb8ceb1b9c90d9.png小结 12f171ae13424f149f43ed9c21ca6e53.png二十、SpringDataRedis的序列化方式 (自动序列化) RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:

252dd19bafcb4660b77d3a87cc83e36a.png 缺点:

1.可读性差

2.内存占用较大

我们可以

自定义RedisTemplate的序列化方式,代码如下:

@Bean

public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory)

throws UnknownHostException {

// 创建Template

RedisTemplate redisTemplate = new RedisTemplate<>();

// 设置连接工厂

redisTemplate.setConnectionFactory(redisConnectionFactory);

// 设置序列化工具

GenericJackson2JsonRedisSerializer jsonRedisSerializer =

new GenericJackson2JsonRedisSerializer();

// key和 hashKey采用 string序列化

redisTemplate.setKeySerializer(RedisSerializer.string());

redisTemplate.setHashKeySerializer(RedisSerializer.string());

// value和 hashValue采用 JSON序列化

redisTemplate.setValueSerializer(jsonRedisSerializer);

redisTemplate.setHashValueSerializer(jsonRedisSerializer);

return redisTemplate;

}

05af6f4d06fb46a6b26ecc538ccfb948.png传入字符串 此时RedisTemplate就符合我们的预期了。

再回到单元测试。

给RedisTemplate加个泛型。

此时就可以往里面存取数据了。这次就能把虎哥正确写入。替代、Rose了

对了因为我们没有引入SpringMVC。因此还要手动引入一个Jackson依赖

com.fasterxml.jackson.core

jackson-databind

b90c084c6fc249f9b18dfe1aabf89efc.png

此时虎哥写入进去了

b90567d6c5a042e2ba95e5519cba8054.png6c6b956edcdd47f192d93fc66feaa41f.png传入对象 74b171a8930c4030b130547f4b60f730.pngbbb8b6585a414ab49e7764f3877338c4.png二十一、StringRedisTemplate(序列化默认String方式) 尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图:

6c5a2a4ef56c4e4eb7053980615167c8.png 为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。

手动序列化 (多了手动处理的过程)e908a511a9f34395b0416980a089bbab.pngStringRedisTemplate Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认就是String方式。省去了我们自定义RedisTemplate的过程:

此时就可以这样写了。

存储对象 d434e16d6a13465f84d080888e481a57.png

@Autowired

private StringRedisTemplate stringRedisTemplate;

// JSON工具

private static final ObjectMapper mapper = new ObjectMapper();

@Test

void testStringTemplate() throws JsonProcessingException {

// 准备对象

User user = new User("虎哥", 18);

// 手动序列化

String json = mapper.writeValueAsString(user);

// 写入一条数据到redis

stringRedisTemplate.opsForValue().set("user:200", json);

// 读取数据

String val = stringRedisTemplate.opsForValue().get("user:200");

// 反序列化

User user1 = mapper.readValue(val, User.class);

System.out.println("user1 = " + user1);

}

f4f6d9572ab544a0bae7e46cc08bfc91.png7add94945298421da8acead5948712f9.png小结:bca593c0a9a0490b95768feac2174218.png二十二、RedisTemplate操作哈希类型d2881418632d47618dfb2efffc109ca5.pngf814838efef742b7930fc16b1821f2b8.png

烤皮皮虾
花滑世锦赛:日本选手坂本花织蝉联女子单人滑冠军