ZSET,即 Sorted-Sets,和 SETS 类型相似,它们都是字符串的集合。它们之间的主要差别是 Sorted-Sets 中的每一个成员都会有一个分数(score)与之关联,Redis 正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管 Sorted-Sets 中的成员必须是唯一的,但是分数(score)却是可以重复的。
在 Sorted-Set 中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于 Sorted-Sets 中的成员在集合中的位置是有序的,因此,即便是访问位于集合中部的成员也仍然是非常高效的。
ZSET 的基本操作如下:
3 >>> conn.zcard('zset-key') 3
ZSET 里的 INCR:
4.0
ZSCORE 获取分数:
2.0
ZRANK 获得所给 key 在 ZSET 中的位置:
2
ZCOUNT 统计在所给分数范围内的 key 个数:
2L
ZREM 删除指定成员:
True
返回指定 rank 范围内的元素,可选的 withscores 参数可指定是否返回分数
[('a', 3.0), ('c', 4.0)]
一些其他命令:
ZREVRANK、ZREVRANGE、ZREVRANGEBYSCORE、ZREMRANGEBYRANK、ZREMRANGEBYSCORE
ZINTERSTORE:
命令格式:
ZINTERSTORE dest-key key-count key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
计算给定的 numkeys 个有序集合的交集,并且把结果放到 destination 中。在给定要计算的 key 和其它参数之前,必须先给定 key 个数(numberkeys)。
默认情况下,结果中一个元素的分数是有序集合中该元素分数之和,前提是该元素在这些有序集合中都存在。因为交集要求其成员必须是给定的每个有序集合中的成员,结果集中的每个元素的分数和输入的有序集合个数相等。
使用 WEIGHTS 选项,你可以为每个给定的有序集指定一个乘法因子,意思就是,每个给定有序集的所有成员的 score 值在传递给聚合函数之前都要先乘以该因子。如果 WEIGHTS 没有给定,默认就是1。
使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。默认使用的参数 SUM,可以将所有集合中某个成员的 score 值之和作为结果集中该成员的 score 值。如果使用参数 MIN 或者 MAX,结果集就是所有集合中元素最小或最大的元素。
如果 key destination 存在,就被覆盖。
redis-py 中的命令格式:
zinterstore(dest, keys, aggregate=None)
例:
3 >>> conn.zadd('zset-2', 'b', 4, 'c', 1, 'd', 0) 3 >>> conn.zinterstore('zset-i', ['zset-1', 'zset-2']) 2L >>> conn.zrange('zset-i', 0, -1, withscores=True) [('c', 4.0), ('b', 6.0)]
解析:
ZUNIONSTORE:
命令格式:
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
计算给定的 numkeys 个有序集合的并集,并且把结果放到 destination 中。在给定要计算的 key 和其它参数之前,必须先给定 key 个数(numberkeys)。 默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和。
redis-py 中的命令格式:
zunionstore(dest, keys, aggregate=None)
例:
conn.zunionstore('zset-u', ['zset-1', 'zset-2'], aggregate='min')
解析: