前面介绍了redis的String和哈希,接下来看看其他的数据结构
- List
LPUSH:左边放入
RPUSH:右边放入
LPOP:取出左边第一个数,并且移除
RPOP:取出右边第一个数,并且移除
由上操作可以看出,先进后出,符合栈的原则,所以用list命令实现栈非常容易。
同理如果选择使用LPUSH 和 RPOP,这时候 则先进先出,符合队列原则。
Blocking MQ(阻塞队列)可以用LPUSH 和 BRPOP
BLPOP key timeout
解析:BLPOP从列表的左边弹出一个元素,若列表没有元素,阻塞等待timeout秒,
如果timeout=0,则一直阻塞。
BRPOP key timeout
右边弹出一个从列表的右边弹出一个元素,若列表没有元素,阻塞等待timeout秒,
如果timeout=0,则一直阻塞。
LRANGE key 0 5,则可以实际作用于微信公众号和微博推送,按顺序推送前五个发消息给你的文章显示出来,这种redis实现比数据库实现效率高很多。
- SET
1、抽奖
Set会自动去重,比如抽奖的情况下,防止用户重复抽奖,如图可以看到,李四sadd了两次,但是并没有成功,用SMEMBERS 可以看到所有用户。
SRANDMEMBER key 2:随机在key抽取两个随机数。
所以用SRANDMEMBER就可以实现抽奖的功能。
这种抽奖抽完还是会在集合中,不会移除,如何抽奖完直接移除呢?
SPOP key 1:这个也是随机抽奖,但是抽完会直接移除。
2、朋友圈点赞
另外set也非常适合朋友圈点赞,比如
给某人朋友圈点赞的张三和李四,也可以用SREM 取消点赞
可以查看某人是否点赞SISMEMBER
可以查看总点赞数SCARD
也可以查看点赞列表SMEMEBERS
除此之外,每个set集合还可以求集合操作。
比如set1{a,b,c},set2{b,c,d},set3{c,d,e}
求三个set集合的交集?
SINTER set1 set2 set3 ->{c}
求三个集合的并集?
SUNION set1 set2 set3->{a,b,c,d,e}
求三个集合的差集?
SDIFF set1 set2 set3->{a}
差集怎么理解的,是第一个集合减去后面两个集合的并集。
因为后面两个并集是 bcde
然后第一个集合减去 abc - bcde
结果留下第一个集合还剩下的元素
所以剩下a
3、朋友圈查看同时关注的人
而这个处理集合最常用的场景就是 朋友圈看互相点赞的功能。
我和朋友共同关注的大v,可以互相看到对方的点赞,可以用set交集。
我和朋友同时关注的人,取交集。
我可能关注的人,就是朋友set集合减去我的。
- 搜索功能
Set集合还可以用于大家熟知的搜索功能
SADD os:android p40 mi10
SADD brand:huawei p40
SADD brand:iphone iphone14
SADD ram:8G p40 mi-10 iphone 14
搜索点击了8g,并且系统iphone的手机,于是set求并集实现搜索:
SINSERT brand:iphone ram:8g ->{iphone14}
- ZSET
实际用例则是微博排行榜
ZINCRBY hotNews:20230608 1 mcnxs 代表明朝那些事被用户点击了一次。
ZINCRBY hotNews:20230608 1 st 代表三体被用户点击了一次。
如何展示这些点击数呢?
ZREVRANGE hotNews:20230608 0 3 WITHSCORES
后面的代表数值也一起展示出来。
那么我们现在计算的20230608的,我们如何计算三天呢?
ZUNIONSTORE hotNews:20230608-20230610 3 hotNews:20230608 hotNews:20230609
hotNews:20230610
这样则会求的这三天的排行点击数。后面再用命令显示出来。
ZREVRANGE hotNews:20230608-20230610 0 9 WITHSCORES