Redis-Sorted Set(有序集合)
简介
Redis中的有序集合和集合一样也是string类型元素的集合,且不允许重复成员。
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是惟一的,但是分数却是可重复的。
集合是通过hash表实现的,所以添加、删除、查找的复杂度都是O(1)。
应用场景
排行榜:使用有序集合可以实现类似微信步数排行榜功能。
Zadd(添加、更新一个或多个成员)
127.0.0.1:6379> zadd zset 1 ike 1.1 andy 2 luke (integer) 0 127.0.0.1:6379> zrange zset 0 10 1) "ike" 2) "andy" 3) "luke"
Zcard(集合中元素个数)
127.0.0.1:6379> zcard zset (integer) 3
Zcount(计算集合中指定分数区间的元素数量)
127.0.0.1:6379> zcount zset 1 1.5 (integer) 2
Zincrby(对有序集合中指定成员的分数进行增量操作)
-
分数值可以是整数值或双精度浮点数。
127.0.0.1:6379> zincrby zset 1 ike "2"
Zinterstore(取一个或多个有序集合的交集存入到一个新有序集合中)
-
语法:zinterstore newzset keysnumber key1 key2
- keysnumber:与有序集合的个数对应。
127.0.0.1:6379> zinterstore zset3 2 zset zset1 (integer) 1 127.0.0.1:6379> zrange zset3 0 -1 1) "ike"
Zlexcount(获取有序集合中指定字典区间内的成员数量)
-
按照字典(英文字母字典排序)序列限制min和max区间;注意使用字典序列返回区间的所有函数的使用隐含前提
是该有序集合内的所有元素的分数相同。
redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e (integer) 5 redis 127.0.0.1:6379> ZADD myzset 0 f 0 g (integer) 2 redis 127.0.0.1:6379> ZLEXCOUNT myzset - + (integer) 7 redis 127.0.0.1:6379> ZLEXCOUNT myzset [b [f (integer) 5
Zrange(返回有序集合中指定区间内的成员)
-
其中成员的位置按分数值递增(从小到大)来排序。
-
具有相同分数值的成员按字典序(lexicographical order )来排列。
127.0.0.1:6379> zrange myzset 0 5 1) "a" 2) "as" 3) "b" 4) "szx" 5) "c" 6) "ffs"
Zrangebylex(通过字典区间返回有序集合的成员)
redis 127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g (integer) 7 redis 127.0.0.1:6379> ZRANGEBYLEX myzset - [c 1) "a" 2) "b" 3) "c" redis 127.0.0.1:6379> ZRANGEBYLEX myzset - (c 1) "a" 2) "b" redis 127.0.0.1:6379> ZRANGEBYLEX myzset [aaa (g 1) "b" 2) "c" 3) "d" 4) "e" 5) "f"
Zrangebyscore(返回有序集合中指定分数区间的成员列表)
-
有序集成员按分数值递增(从小到大)次序排列。
- 默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
- 语法:zrangebyscore key min max
127.0.0.1:6379> zrangebyscore myzset -inf +inf // 获取整个有序集合 1) "ike" 2) "luke" 3) "andy" 127.0.0.1:6379> zrangebyscore myzset -inf +inf withscores // 获取整个有序集及成员的 score 值 1) "ike" 2) "5" 3) "luke" 4) "10" 5) "andy" 6) "15" 127.0.0.1:6379> zrangebyscore myzset (1 5 // 返回 1 < socre <= 5 1) "ike" 127.0.0.1:6379> zrangebyscore myzset (5 (11 // 返回 1 < score < 11 1) "luke"
Zrank(返回有序集合中指定成员的排名,按分值从小到大顺序排列)
127.0.0.1:6379> zrank myzset ike (integer) 0 127.0.0.1:6379> zrank myzset luke (integer) 1 127.0.0.1:6379> zrank myzset andy (integer) 2
Zrem(移除有序集合中的一个或多个成员)
-
不存在的成员将被忽略。
-
当key不是有序集合时,返回一个错误。
- 返回值:被成功移除的成员数量,不包括被忽略的成员。
127.0.0.1:6379> zrem myzset luke (integer) 1 127.0.0.1:6379> zrange myzset 0 -1 1) "ike" 2) "andy"
Zremrangebylex(移除有序集合中给定的字典区间所有成员)
127.0.0.1:6379> zadd myzset 0 ike 0 andy 0 luke 0 apple (integer) 4 127.0.0.1:6379> zremrangebylex myzset [al [ddd (integer) 2 127.0.0.1:6379> zrange myzset 0 -1 1) "ike" 2) "luke" 127.0.0.1:6379> zremrangebylex myzset [al [zz (integer) 2
Zremrangebyrank(移除有序集合中指定排名区间内的所有成员)
127.0.0.1:6379> zadd myzset 5 ike 10 andy 15 luke 20 apple (integer) 4 127.0.0.1:6379> zremrangebyrank myzset 0 2 // 移除下标0 ~ 2 (integer) 3 127.0.0.1:6379> zrange myzset 0 -1 1) "apple"
Zremrangebyscore(移除有序集合中制定分数区间的所有成员)
127.0.0.1:6379> zremrangebyscore myzset 1 10 (integer) 2 127.0.0.1:6379> zrange myzset 0 -1 1) "luke" 2) "apple"
Zrevrange(返回有序集合中指定区间的成员,通过索引,分数从高到低)
127.0.0.1:6379> zrevrange myzset 0 -1 withscores 1) "apple" 2) "20" 3) "luke" 4) "15"
Zrevrangebyscore(返回有序集合中指定分数区间内的所有成员,按分数递减排序)
127.0.0.1:6379> zrange myzset 0 -1 withscores 1) "luke" 2) "15" 3) "apple" 4) "20" 127.0.0.1:6379> zrevrangebyscore myzset 15 1 1) "luke" 127.0.0.1:6379> zrevrangebyscore myzset +inf -inf // 逆序排列所有成员 1) "apple" 2) "luke"
Zrevrank(返回有序集合中成员的排名,其中有序集合成员按照分数递减排序)
127.0.0.1:6379> zrevrank myzset luke (integer) 1 127.0.0.1:6379> zrevrank myzset apple (integer) 0
Zscore(返回有序集合中成员的分数值)
- 返回值:如果成员不是有序集合中的成员,或者key不存在,则返回nil。
127.0.0.1:6379> zscore myzset luke "15"
Zunionstore(给定一个或多个有序集合的并集,并存储到新的有序集合中)
127.0.0.1:6379> zadd zset1 500 jack 1000 luke 2000 ike 3000 andy (integer) 4 127.0.0.1:6379> zadd zset2 500 apple 1000 luke 2000 ike 3000 andy (integer) 4 127.0.0.1:6379> zunionstore zset3 2 zset1 zset2 weights 1 3 // zset1 * 1 zset2 * 3 127.0.0.1:6379> zrange zset3 0 -1 withscores 1) "jack" 2) "500" 3) "apple" 4) "1500" 5) "luke" 6) "4000" 7) "ike" 8) "8000" 9) "andy" 10) "12000"
Zscan(迭代有序集合中的元素)
- 返回值:返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(member)和一个分值(score)组成。
127.0.0.1:6379> zscan zset3 0 match "i*" 1) "0" 2) 1) "ike" 2) "10000"
有序集合中有三种排序方式:按分数排序、按索引、按字典区间(也就是值的字母数字等区间排序)

浙公网安备 33010602011771号