数据结构-Redis(二)

前面介绍了redis的String和哈希,接下来看看其他的数据结构

  • List

LPUSH:左边放入

RPUSH:右边放入

LPOP:取出左边第一个数,并且移除

RPOP:取出右边第一个数,并且移除

数据结构-Redis(二)_第1张图片

由上操作可以看出,先进后出,符合栈的原则,所以用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:这个也是随机抽奖,但是抽完会直接移除。

数据结构-Redis(二)_第2张图片

2、朋友圈点赞

另外set也非常适合朋友圈点赞,比如

给某人朋友圈点赞的张三和李四,也可以用SREM 取消点赞

可以查看某人是否点赞SISMEMBER

可以查看总点赞数SCARD

也可以查看点赞列表SMEMEBERS

数据结构-Redis(二)_第3张图片

除此之外,每个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集合减去我的。

  1. 搜索功能

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

数据结构-Redis(二)_第4张图片

你可能感兴趣的:(redis,redis,缓存,数据库)