有序集合对象的编码可以是ziplist
或者skiplist
ziplist
编码的压缩列表对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员(member
),第二个元素则保存元素的分值(score
)
压缩列表内的集合元素安分值从小到大进行排序,分值较小的元素被放置在靠近表头的方向,而分值交大的元素则被放置在靠近表尾的方向。
skiplist
编码的有序集合对象使用zset
结构作为底层实现,一个zset
结构同时包含一个字典和一个跳跃表。
typedef struct zset{
zskiplist *zsl;
dict *dict;
}zset
zset
结构中的zsl
跳跃表按分值从小到大保存了所有集合元素,每个跳跃表节点都保存了一个集合元素:跳跃表节点的object
属性保存了元素的成员,而跳跃表节点的score
属性则保存了元素的分值。通过这个跳跃表,程序可以对有序集合进行范围性操作。
zset
结构中的dict
字典为有序集合创建了一个从成员到分值的映射,字典中的每个键值对都保存了一个集合元素:字典的键保存了元素的成员,字典的值保存了元素的分值。通过这个字典。
8.6.1 编码的转换
当有序集合对象可以同时满足以下两个条件时,对象用ziplist
编码:
- 有序集合保存的元素个数小于128
- 有序集合保存的所有元素的长度都小于64字节;
8.6.2 有序集合命令
1. ZADD
ZADD key score member [[score member] [score member] ...]
将一个或多个member
元素及其score
值加入到有序集key
当中。
如果某个member
已经是有序集的成员,那么更新这个member
的score
值,并通过重新插入这个member
元素,来保证该member
在正确的位置上。
score
值可以是整数值或双精度浮点数。
如果key
不存在,则创建一个空的有序集并执行ZADD
操作。
当key
存在但不是有序集类型时,返回一个错误。
. 2. ZCARD
ZCARD key
返回有序集key
的基数。
3. ZCOUNT
ZCOUNT key min max
返回有序集key
中,score
值在min
和max
之间(默认包括score
值等于min
或max
)的成员的数量。
4. ZINCRBY
ZINCRBY key increment member
为有序集key
的成员member
的score
值加上增量increment
。
可以通过传递一个负数值increment
,让score
减去相应的值,比如ZINCRBY key -5 member
,就是让member
的score
值减去5
。
当key
不存在,或member
不是key
的成员时,ZINCRBY key increment member
等同于ZADD key increment member
。
当key
不是有序集类型时,返回一个错误。
score
值可以是整数值或双精度浮点数。
5. ZRANGE
ZRANGE key start stop [WITHSCORES]
返回有序集key
中,指定区间内的成员。
其中成员的位置按score
值递增(从小到大)来排序。
6. ZRANGEBYSCORE
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回有序集key
中,所有score
值介于min
和max
之间(包括等于min
或max
)的成员。有序集成员按score
值递增(从小到大)次序排列。
7. ZRANK
ZRANK key member
返回有序集key
中成员member
的排名。其中有序集成员按score
值递增(从小到大)顺序排列。
排名以0
为底,也就是说,score
值最小的成员排名为0
。
8. ZREM
ZREM key member [member ...]
移除有序集key
中的一个或多个成员,不存在的成员将被忽略。
当key
存在但不是有序集类型时,返回一个错误。
9. ZREMRANGEBYRANK
ZREMRANGEBYRANK key start stop
移除有序集key
中,指定排名(rank
)区间内的所有成员。
区间分别以下标参数start
和stop
指出,包含start
和stop
在内。
10. ZREMRANGEBYSCORE
ZREMRANGEBYSCORE key min max
移除有序集key
中,所有score
值介于min
和max
之间(包括等于min
或max
)的成员。
11. ZREVRANGE
ZREVRANGE key start stop [WITHSCORES]
返回有序集key
中,指定区间内的成员。
其中成员的位置按score
值递减(从大到小)来排列。
具有相同score
值的成员按字典序的逆序(reverse lexicographical order
)排列。
除了成员按score
值递减的次序排列这一点外,ZREVRANGE
命令的其他方面和ZRANGE
命令一样。
12. ZREVRANGEBYSCORE
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
返回有序集key
中,score
值介于max
和min
之间(默认包括等于max
或min
)的所有的成员。有序集成员按score
值递减(从大到小)的次序排列。
具有相同score
值的成员按字典序的逆序(reverse lexicographical order
)排列。
除了成员按score
值递减的次序排列这一点外,ZREVRANGEBYSCORE
命令的其他方面和ZRANGEBYSCORE
命令一样。
13 ZREVRANK
ZREVRANK key member
返回有序集key
中成员member
的排名。其中有序集成员按score
值递减(从大到小)排序。
排名以0
为底,也就是说,score
值最大的成员排名为0
。
使用ZRANK
命令可以获得成员按score
值递增(从小到大)排列的排名。
14. ZSCORE
ZSCORE key member
返回有序集key
中,成员member
的score
值。
如果member
元素不是有序集key
的成员,或key
不存在,返回nil
。
15. ZUNIONSTORE
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
计算给定的一个或多个有序集的并集,其中给定key
的数量必须以numkeys
参数指定,并将该并集(结果集)储存到destination
。
默认情况下,结果集中某个成员的score
值是所有给定集下该成员score
值之和。
16. ZINTERSTORE
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
计算给定的一个或多个有序集的交集,其中给定key
的数量必须以numkeys
参数指定,并将该交集(结果集)储存到destination
。
默认情况下,结果集中某个成员的score
值是所有给定集下该成员score
值之和.
17. ZSCAN
ZSCAN key cursor [MATCH pattern] [COUNT count]
18. ZRANGEBYLEX
ZRANGEBYLEX key min max [LIMIT offset count]
当有序集合的所有成员都具有相同的分值时, 有序集合的元素会根据成员的字典序(lexicographical ordering
)来进行排序, 而这个命令则可以返回给定的有序集合键key
中, 值介于min
和max
之间的成员。
可选的LIMIT offset count
参数用于获取指定范围内的匹配元素(就像SQL
中的SELECT LIMIT offset count
语句)。 需要注意的一点是,如果offset
参数的值非常大的话, 那么命令在返回结果之前, 需要先遍历至offset
所指定的位置, 这个操作会为命令加上最多O(N)
复杂度。
19. ZLEXCOUNT
ZLEXCOUNT key min max
对于一个所有成员的分值都相同的有序集合键key
来说, 这个命令会返回该集合中,成员介于min
和max
范围内的元素数量。
20. ZREMRANGEBYLEX
ZREMRANGEBYLEX key min max
对于一个所有成员的分值都相同的有序集合键key
来说,这个命令会移除该集合中,成员介于min
和max
范围内的所有元素。
这个命令的min
参数和max
参数的意义和ZRANGEBYLEX
命令的min
参数和max
参数的意义一样。