Redis 数据类型 Zset

Redis 数据类型 Zset(有序集合)

Redis 常用命令,思维导图 >>>

zsetRedis提供的一个非常特别的数据结构,常用作排行榜等功能,以用户idvalue,关注时间或者分数作为score进行排序。与其他数据结构相似,zset也有两种不同的实现,分别是zipListskipList

底层实现

zset 存储示意图:每个 value 后面都携带一个分数,然后用作排序

跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入、删除、查找的复杂度均为O(logN)。简单说来跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能,正是这个跳跃的功能,使得在查找元素时,跳表能够提供O(logN)的时间复杂度。

看一个有序链表,如下图(最左侧的灰色节点表示一个空的头结点):

有序链表结构图

在这样一个链表中,如果我们要查找某个数据,那么需要从头开始逐个进行比较,直到找到包含数据的那个节点,或者找到第一个比给定数据大的节点为止(没找到)。也就是说,时间复杂度为O(n)。同样,当我们要插入新数据的时候,也要经历同样的查找过程,从而确定插入位置。

假如我们每相邻两个节点增加一个指针,让指针指向下下个节点,如下图:

每两个节点增加一个跳跃指针的有序链表

这样所有新增加的指针连成了一个新的链表,但它包含的节点个数只有原来的一半。现在当我们想查找数据的时候,可以先沿着这个新链表进行查找。当碰到比待查数据大的节点时,再回到原来的链表中进行查找。比如,我们想查找23,查找的路径是沿着下图中标红的指针所指向的方向进行的:

一个搜索路径的例子

  • 23首先和7比较,再和19比较,比它们都大,继续向后比较。
  • 但23和26比较的时候,比26要小,因此回到下面的链表(原链表),与22比较。
  • 23比22要大,沿下面的指针继续向后和26比较。23比26小,说明待查数据23在原链表中不存在,而且它的插入位置应该在22和26之间。

 

将压缩链表和跳跃链表作一个对比吧

 

List Set Zset 对比

数据结果是否允许重复元素是否有序有序实现方式应用场景
列表 List索引下标时间轴、消息队列
集合 Set标签、社交
有序集合 Zset分值排行榜,社交

 

应用场景 & 学习总结

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复

使用场景:

1、根据时间排序的新闻列表等,

2、 阅读排行

 

常用命令

zadd key score member[{score member}...]
--- 创建或设置指定key对应的有序集合,根据每个值对应的score来排名,升序。例如有命令 zadd key1 10 A 20 B 30 D 40 C;那么真实排名是 A B D C

zrem key member
--- 删除指定key对应的集合中的member元素

zcard key
--- 返回指定key对应的有序集合的元素数量

zincrby key increment member
--- 将指定key对应的集合中的member元素对应的分值递增加 increment

zcount key min max
--- 返回指定key对应的有序集合中,分值在min~max之间的元素个数

zrank key member
--- 返回指定key对应的有序集合中,指定元素member在集合中排名,从0开始切分值是从小到大升序

zscore key member
--- 返回指定key中的集合中指定member元素对应的分值

zrange key min max [withscores]
--- 返回指定key对应的有序集合中,索引在min~max之间的元素信息,如果带上 withscores 属性的话,可以将分值也带出来

zrevrank key member
--- 返回指定key对应的集合中,指定member在其中的排名,注意排名从0开始且按照分值从大到小降序

zrevrange key start end [withscores]
--- 指定key对应的集合中,分值在 start~end之间的降序,加上 withscores 的话可以将分值以及value都显示出来

zrangebyscore key start end [withscores]
--- 同 zrange命令不同的是,zrange命令是索引在startend范围的查询,而zrangebyscore命令是根据分值在startend之间的查询且升序展示

zrevrangebyscore key max min [withscores]

--- 同zrangebyscore命令不同的是,zrangebyscores是根据分值从小到大升序展示,而zrevrangebyscore命令是从max到min降序展示

zremrangebyrank key start end
--- 移除指定key对应集合中索引在start~end之间(包括start和end本身)的元素

zremrangebyscore by min max
--- 同zremrangebyrank命令类似,不同的该命令是删除分值在min~max之间的元素

zinterstore desk-key key-count key...
--- 获取指定数量的key的交集。例如有 key1:{10:A,20:B,30:C},key2{40:B,50:C,60:D},那么命令 zinterstore key3 2 key1 key2 意思就是 将key1 key2这两个集合的交集 赋给key3,如何获取key1与key2的交集呢。 key1中存在 A B C,key2中存在 B C D,那么交集就是 B 和 C,且 B与C对应的score也会叠加,即 key3{B:20+40=60,C:30+50=80}

zunionstore desk-key key-count key...
--- 获取指定数量key的并集,例如有 key1{10:A,20:B,30:C},key2{40:B,50:C,60:D},可以看出 A和D不是key1与key2共有的,但是并集中只要存在就会记录进去,然后B与C是共有的,即 并集的结果就是 key3{10:A,B:60,D:60,C:80}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汀风说后端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值