五大数据结构04_有序集合ZSet


它保留了集合不能有重复成员的特性,但不同的是, 有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是, 它给每个元素设置一个分数(score)作为排序的依据。
如图所示,该有序集合包含kris、mike、frank、tim、martin、tom,它们的分数分别是1、91、200、220、250、251,有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。
在这里插入图片描述
有序集合中的元素不能重复,但是score可以重复,就好比学号不能重复但是考试成绩可以

给出了列表、集合和有序集合三者对比

在这里插入图片描述

常用命令

增 zadd key score member [score member …]
注意:
· Redis3.2为zadd命令添加了nx、xx、ch、incr四个选项:
· nx:member必须不存在,才可以设置成功,用于添加。
· xx:member必须存在,才可以设置成功,用于更新。
· ch:返回此次操作后,有序集合元素和分数发生变化的个数
· incr:对score做增加,相当于后面介绍的

有序集合相比集合提供了排序字段,但是也产生了代价,
zadd的时间复杂度为O(log(n)),sadd的时间复杂度为O(1

计算成员个数 zcard key
计算某个成员的分数zscore key member

计算成员的排名 zrank key member/ zrevrank key member
zrank是从分数从低到高返回排名,zrevrank反之。

删除成员 zrem key member [member …]
增加成员的分数 zincrby key increment member

返回指定排名范围的成员
zrange key start end [withscores] 升序
zrevrange key start end [withscores] 降序 带上withscores就会返回带上分数

zrangebyscore    key min max [ withscores] [ limit offset coun t]   
zrevrangebyscore key max min [withscores] [limit offset count]

其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之。例如下面操作从低到高返回2到5的成员,withscores选项会同时返回每个成员的分数。[limit offset count]选项可以限制输出的起始位置和个数:

127.0.0.1:6379> zadd zset 2 kk 3 kkk 4 kkkk
(integer) 3
127.0.0.1:6379> zrangebyscore zset 2 5
1) "kk"
2) "kkk"
3) "kkkk"
127.0.0.1:6379>    

同时min和max还支持开区间(小括号)和闭区间(中括号),-inf和+inf分别代表无限小和无限大:

127.0.0.1:6379>  zrangebyscore zset (2 5
1) "kkk"
2) "kkkk"

返回指定分数范围成员个数zcount key min max
删除指定排名内的升序元素zremrangebyrank key start end
(11)删除指定分数范围的成员 zremrangebyscore key min max

下面操作将>250的成员全部删除,返回结果为成功删除的个数:
zremrangebyscore user:ranking (250 +inf

2.集合间的操作

1、交集

zinterstore destination numkeys key [key ...] [weights weight [weight ...]]
[aggregate sum|min|max]

· destination:交集计算结果保存到这个键。
· numkeys:需要做交集计算键的个数。
· key[key…]:需要做交集计算的键。
· weights weight[weight…]:每个键的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1。
· aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认值是sum
下面操作对user:ranking:1和user:ranking:2做交集,weights和
aggregate使用了默认配置,可以看到目标键user:ranking:1_inter_2对分值做了sum操作:
先导入数据:
在这里插入图片描述
在这里插入图片描述
并集 :

zunionstore destination numkeys key [key ...]
 [weights weight [weight ...]] [aggregate sum|min|max]
 该命令的所有参数和zinterstore是一致的,只不过是做并集计算,

时间复杂度
在这里插入图片描述

内部编码

在这里插入图片描述

使用场景

有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。本节使用赞数这个维度,记录每天用户上传视频的排行榜。主要需要实现以下4个功能。
1、添加用户赞数
zadd user:ranking:2016_03_15 mike 3
mike 得了3个赞
2、展示获取赞数最多的十个用户
zrevrangebyrank user:ranking:2016_03_15 0 9
3、)展示用户信息以及用户分数
zscore user:ranking:2016_03_15 mike 获取赞数
zrank user:ranking:2016_03_15 mike 获取排名

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值