Redis(1)

238 阅读4分钟

Redis是时下流行的缓存中间件。

Redis是一个键值数据库,比如key是“1001”, value是{"id": "123", "name": "lisan"}. 因此Redis是没有类型约束的,可以存任何格式,是一种NoSql.

配置

安装redis macos

brew install redis

前台运行redis:

redis-server

后台运行启动redis: 

brew services start redis

redis配置文件的位置: 

/usr/local/etc/redis.conf

Once Redis is running, you can test it by running redis-cli

redis-cli

redis client非常全,常用的就有上面的cli客户端

配置完成后,可以试一下redis命令:

Step 1: 开一个terminal,输入redis-server来启动redis
Step 2: 开另一个terminal,输入redis-cli,用cli客户端操作redis

通过学习redis的数据类型,来熟悉相应的redis命令。例如String类型的操作:

Hash类型的操作:

Hash可以对对象中的每个字段单独存储,可以对某个字段做CRUD。

HSET rooling:user:3 age 21
HSET rooling:user:3 name wangli
HGET rooling:user:3 name
HGET rooling:user:3 age
HMSET rooling:user:4 name HanMei age 20 sex male
HGET rooling:user:4 sex
HMGET rooling:user:4 name age sex what
HGETALL rooling:user:4
HKEYS rooling:user:4
HINCRBY rooling:user:4 age 1

List类型的操作:

Redis中的List类型与Java中LinkedList类似,可以看作一个双向链表结构,既可以支持正向检索,也可以支持反向检索。特征:有序,元素可重复,插入和删除快,查询慢。常用来存储一个有序数据,例如朋友圈点赞列表,评论列表等。

127.0.0.1:6379> LPUSH rooling:like:1 mingming dawei zixun wangqiqi
(integer) 5
127.0.0.1:6379> LRANGE rooling:like:1 2 3
1) "dawei"
2) "mingming"
127.0.0.1:6379> BLPOP rooling:like:2 100
1) "rooling:like:2"
2) "someele"
(36.54s)
127.0.0.1:6379>

Set类型的操作:

Redis中的Set类型与Java中HashSet类似,可以看作一个value为null的HashMap。特征:无序,元素不可重复,查找快,支持交集,并集,差集等功能。适用于好友列表,共同好友等功能。

127.0.0.1:6379> SADD s1 a b c
(integer) 3
127.0.0.1:6379> SMEMBERS s1
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> SREM s1 a
(integer) 1
127.0.0.1:6379> SMEMBERS s1
1) "c"
2) "b"
127.0.0.1:6379> SISMEMBER s1 a
(integer) 0
127.0.0.1:6379> SISMEMBER s1 b
(integer) 1
127.0.0.1:6379> SADD s2 a b c d
(integer) 4
127.0.0.1:6379> SINTER s1 s2
1) "c"
2) "b"
127.0.0.1:6379> SDIFF s1 s2
(empty array)
127.0.0.1:6379> SUNION s1 s2
1) "d"
2) "b"
3) "c"
4) "a"
127.0.0.1:6379>



zhangsan 和 lisi的好友列表差异:

127.0.0.1:6379> SADD zhangsan lisi wangwu zhaoliu
(integer) 3
127.0.0.1:6379> sadd lisi wangwu mazi ergou
(integer) 3
127.0.0.1:6379> scard zhangsan
(integer) 3
127.0.0.1:6379> sinter zhangsan lisi
1) "wangwu"
127.0.0.1:6379> sdiff zhangsan lisi
1) "lisi"
2) "zhaoliu"
127.0.0.1:6379> sunion zhangsan lisi
1) "lisi"
2) "zhaoliu"
3) "mazi"
4) "wangwu"
5) "ergou"
127.0.0.1:6379> sdiff lisi zhangsan
1) "mazi"
2) "ergou"
127.0.0.1:6379> sismember zhangsan lisi
(integer) 1
127.0.0.1:6379> sismember lisi zhangsan
(integer) 0
127.0.0.1:6379> smembers zhangsan
1) "wangwu"
2) "lisi"
3) "zhaoliu"
127.0.0.1:6379>

SortedSet类型的操作:

Redis的SortedSet是一个可排序的set集合。SortedSet中的每一个元素都有一个score属性,可基于score属性对元素进行排序,底层的实现是一个跳表(SkipList)加一个hash表。SortedSet特征:可排序,元素不重复,查询速度快。适用于排行榜这样的功能。

(error) ERR syntax error
127.0.0.1:6379> ZADD stus NX 85 Jack 89 Lucy 82 Rose 95 Tom Jerry 92 Amy 76 Miles
(error) ERR syntax error
127.0.0.1:6379> ZADD stus 85 Jack
(integer) 1
127.0.0.1:6379> ZADD stus 89 Lucy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles
(integer) 6
127.0.0.1:6379> ZREM stus Tom
(integer) 1
127.0.0.1:6379> ZRANK stus Rose
(integer) 2
127.0.0.1:6379> ZREVRANK stus Rose
(integer) 3
127.0.0.1:6379> ZCARD stus
(integer) 6
127.0.0.1:6379> ZCOUNT stus 0 80
(integer) 2
127.0.0.1:6379> ZINCBY stus 2 Amy
(error) ERR unknown command 'ZINCBY', with args beginning with: 'stus' '2' 'Amy'
127.0.0.1:6379> ZINCRBY stus 2 Amy
"94"
127.0.0.1:6379> ZRANGE stus 0 2
1) "Miles"
2) "Jerry"
3) "Rose"
127.0.0.1:6379> ZREVRANGE stus 0 2
1) "Amy"
2) "Lucy"
3) "Jack"

Java的客户端们

Spring Data Redis兼容了jedis和lettuce. 

jedis

Step 1: 引入jedis依赖
Step 2: 建立连接
Step 3: 使用jedis操作数据
Step 4: 释放资源

Spring-Data-Redis

Step 1: start.spring.io新建一个springboot项目
Step 2: 引入spring-boot-starter -data-redis依赖,并在application.yml中完成redis的相关配置
Step 3: 用Autowired注解自动注入一个RedisTemplate
Step 4: 使用api操作redis即可

自动会注入RedisTemplate 的bean,要注意如果不配置的话,key和value都会进行redis的object序列化,转换成字节码的形式存储。所以需要手动配置RedisTemplate的序列化配置。或者直接用StringRedisTemplate,如果想要存Java对象的话,直接手动专成json再存进去。

案例

注册用户时发送验证码,然后在注册请求进来时校验验证码是否正确。

  • verify-code 接口,生成随机6位数的验证码 -> 放入redis中 -> send 

  • login 接口,验证验证码 -> 把user放入redis中做缓存

  • 其他接口,需要验证用户的token,从redis中获取这个用户是否存在,如果没有,则要求重新登录(返回401). 如果有,则刷新用户redis的有效期
    1. refresh interceptor 从header中读取token -> 从redis中获取用户 -> 放user到ThreadLocal -> 更新redis中这个key的TTL
    2. login interceptor 从ThreadLocal中获取user,如果没有,则返回401
    3. 将上面的两个Interceptor放入到Interceptor Registry中,并设置好执行顺序

Reference:

redis官网

redis doc

redis get started

黑马视频教程