有序集合对象的编码可以是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参数的意义一样。