String类型
是redis中最基本的数据类型,一个key对应一个value。
String类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。如数字,字符串,jpg图片或者序列化的对象。
缓存功能
经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> get hello
(nil)
计数功能
虽然value是String,但是我们可以把他当做一个Interger类型来做简单的加减操作。
127.0.0.1:6379> get counter
"2"
127.0.0.1:6379> incr counter
(integer) 3
127.0.0.1:6379> get counter
"3"
127.0.0.1:6379> incrby counter 100
(integer) 103
127.0.0.1:6379> get counter
"103"
127.0.0.1:6379> decr counter
(integer) 102
127.0.0.1:6379> get counter
"102"
redis实现分布式锁
这个会专门写一篇相关的内容介绍。此处先知道可以这么做。
集群环境下的Session共享
常见方案spring session + redis实现session共享,
Hash类型
是一个Mapmap,指值本身又是一种键值对结构。可以幻想成有这么一种结构:
Redis<String,Map<String,String>> redisMap = new Redis<>();
那么如何在实际开发中运用好这个数据结构呢?
存储关系型数据库的一行数据
MySQL存储结构
转换为Redis结构
我们的key可以用(表名):(行id)进行拼接。数据库的列作为Hash结构的key,对应的唯一行值作为value值。若用 redis 模拟做关系复杂查询开发困难,维护成本高。
淘宝购物车的设计
功能需求
1.全选功能-获取该用户的所有购物车商品
2.商品数量-购物车图标上要显示购物车里商品的总数
3.删除-要能移除购物车里某个商品
4.增加或减少某个商品的数量
redis结构设计
此时,我们可以使用redis的key作为某用户的购物车,Hash结构的key存储产品id,value作为购买数量。就可以轻松完成需求。
加入数据
向用户1的购物车中加入三类商品:prod001两个,prod002两个,prod003三个。
hmset user1:chart prod001 2 Prod002 2 Prod003 3
全选
hgetall user1:chart
可以用Redis获取所有商品id(prod001,Prod002,Prod003),再用该id去数据库或redis中获取商品详情。
获取商品类别总数
hlen user1:chart
获取商品数量总数
hvals user1:chart
当然,这只是每个产品对应的数量,我们取出后需要自己进行累加。
移除某个/多个产品
hdel user1:chart prod001 Prod002
增加或减少某个产品的数量
hincrby user1:chart prod001 1 //增加一个prod001
hdecrby user1:chart prod001 1 //减少一个prod001
List类型
redis 使用双端链表实现的 List,是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。
微信订阅号(天然的时间顺序)
每当我们点击订阅了一个公众号后,该公众号就会保存了我们的微信id。根据不同用户订阅信息后,该公众号发布一条信息,就会广播到每一个用户的手机上。这就是常见的发布订阅功能。是不是很像消息队列?
订阅
发布
对于某个用户的推送
CSDN给user:1推送一个消息id为9527
lpush user:1 9527
男子别输在说话上也发布了一条消息ID为9528
lpush user:1 9528
用户查看自己的推送消息
lrange user:1 0 5 //查看前五条
Set类型
set集合类型也是用来保存多个字符串的元素,但和list列表不同的是集合中 1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。
抽奖活动
功能需求
1. 用户点击参与抽奖
2. 卖家在奖池中抽取2名中奖者
3. 卖家查看有多少用户参与本次抽奖
注意
1. 用户参加活动不可重复参加。set可以帮我们去重。
2. 我们抽奖环节,抽到的用户就要从奖池中干掉,否则下次参加有可能重复抽取。
redis结构设计
活动设置为redis的key,参与抽奖的用户设为value。
模拟参与抽奖
sadd active:001 user1 //客户端参与抽奖,正常只能添加一条
sadd active:001 user2 //下面都是其他客户端参与的抽奖
sadd active:001 user3
sadd active:001 user4
抽2名幸运观众
srandmember active:001 2 //随机获取2名,本方法不适合此处
spop active:001 2 //获取并删除2名用户
查看参与抽奖的用户人数
smembers active:001
微信点赞
功能需求
1. 张三对消息ID008点赞
2. 张三取消ID008点赞
3. 检查用户是否点赞
4. 获取消息ID008所有的点赞用户列表
5. 消息ID008的点赞数计算
redis结构设计
某用户的某条朋友圈设置为redis的key,点赞的用户设为value。
点赞
sadd user1:friend:Wechat1 user2:id //点赞是用户行为,一个客户端只能点一个
sadd user1:friend:Wechat1 user3:id //下面都是其他客户端点赞
sadd user1:friend:Wechat1 user4:id
sadd user1:friend:Wechat1 user5:id
取消点赞
srem user1:friend:Wechat1 user2:id
检查用户是否点过赞
sismember user1:friend:Wechat1 user2:id
获取消息ID008所有的点赞用户列表
smembers user1:friend:Wechat1
消息ID008的点赞数计算
scard user1:friend:Wechat1
微博关系设计
set特殊指令
setA={A,B,C} setB={B, C}
集合与集合之间的交集
sinter setA setB-->得到集合{B,C}
集合与集合之间的并集
sunion setA setB -->得到集合{A,B,C}
集合与集合之间的差集
sdiff setA setB-->得到集合{A}
条件
1. James老师关注的人
sadd jamesCares lison,peter,king,av
2. Lison老师关注的人
sadd lisonCares james,av,cjk,king
3. av老师关注的人
sadd avCares deer,cjk,king
计算
1. James和lison共同关注的人
sinter jamesCares lisonCares //计算结果为 {av, king}
2. lison关注的人,avCares是否也关注(使用java代码实现)
sismember lisonCares king && sismember avCares king
3. 我可能认识的人
SDIFF lisonCares jamesCares
Zet存储
Zset有序集合和set集合,list列表有着必然的联系,保留了set集合不能有重复成员的特性,区别是,有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。从结构上有点像Hash结构,但Zset的key不是让我们用来和value做映射关系的,而是专门用来排序用的。
百度热搜榜
功能需求
看到某天根据热度排行的数据列表。由于list列表只会根据时间排序,因此不符合我们的需求,因此我们需要选择根据数据热点排行的zset。
redis结构设计
一每一天为单位,统计热点数据。因此Redis的key设置为当天日期,value设置为各种话题。
新增话题
zadd topic:2021-06-04 1 XinGuanFeiYan 1 GaoKaoDaoJiShi //新冠肺炎,高考倒计时
点击话题(会根据点击数实时排序)
ZINCRBY topic:2021-06-04 1 XinGuanFeiYan //增加一个点击数
ZINCRBY topic:2021-06-04 -1 XinGuanFeiYan //减少一个点击数(实际中不会发生负数)
展示今日前9排名
zrevrange topic:2021-06-04 0 9 withscores
统计近3日点击数据
zunionstore topic:3day 3 topic:2021-06-04 topic:2021-06-03 topic:2021-06-02
展示近3日的排行前9名(在合并点击数据的基础上统计)
zrevrange topic:3day 0 9 withscores
List,Set与Zset的异同
数据结构 | 是否允许元素重复 | 是否有序 | 有序实现方式 | 应用场景 |
列表(List) | 是 | 是 | 数组下标 | 时间轴列表,消息队列 |
集合(Set) | 否 | 否 | 无 | 点赞数,抽奖,微博关系 |
有序集合(Zset) | 有 | 是 | 热点度key | 话题排行榜 |