文章目录

  • 常用命令
  • 2.集合间的操作
  • 内部编码
  • 使用场景



它保留了集合不能有重复成员的特性,但不同的是,

有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,

它给每个元素设置一个分数(score)作为排序的依据。


如图所示,该有序集合包含kris、mike、frank、tim、martin、tom,它们的分数分别是1、91、200、220、250、251,有序集合提供了获取指定分数和元素范围查询、计算成员排名等功能,合理的利用有序集合,能帮助我们在实际开发中解决很多问题。


Android 集合有序 有序集合组个数_权重


有序集合中的元素不能重复,但是score可以重复,就好比学号不能重复但是考试成绩可以

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

Android 集合有序 有序集合组个数_使用场景_02

常用命令

增 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操作:

先导入数据:

Android 集合有序 有序集合组个数_权重_03


Android 集合有序 有序集合组个数_使用场景_04


并集 :

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

时间复杂度

Android 集合有序 有序集合组个数_Android 集合有序_05

内部编码

Android 集合有序 有序集合组个数_有序集合_06

使用场景

有序集合比较典型的使用场景就是排行榜系统。例如视频网站需要对用户上传的视频做排行榜,榜单的维度可能是多个方面的:按照时间、按照播放数量、按照获得的赞数。本节使用赞数这个维度,记录每天用户上传视频的排行榜。主要需要实现以下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 获取排名