8.6 有序集合对象

有序集合对象的编码可以是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已经是有序集的成员,那么更新这个memberscore值,并通过重新插入这个member元素,来保证该member在正确的位置上。
score值可以是整数值或双精度浮点数。
如果key不存在,则创建一个空的有序集并执行ZADD操作。
key存在但不是有序集类型时,返回一个错误。

. 2. ZCARD
ZCARD key

返回有序集key的基数。

3. ZCOUNT
ZCOUNT key min max

返回有序集key中,score值在minmax之间(默认包括score值等于minmax)的成员的数量。

4. ZINCRBY
ZINCRBY key increment member

为有序集key的成员memberscore值加上增量increment
可以通过传递一个负数值increment,让score减去相应的值,比如ZINCRBY key -5 member,就是让memberscore值减去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值介于minmax之间(包括等于minmax)的成员。有序集成员按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)区间内的所有成员。
区间分别以下标参数startstop指出,包含startstop在内。

10. ZREMRANGEBYSCORE
ZREMRANGEBYSCORE key min max

移除有序集key中,所有score值介于minmax之间(包括等于minmax)的成员。

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值介于maxmin之间(默认包括等于maxmin)的所有的成员。有序集成员按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中,成员memberscore值。
如果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中, 值介于minmax之间的成员。
可选的LIMIT offset count参数用于获取指定范围内的匹配元素(就像SQL中的SELECT LIMIT offset count语句)。 需要注意的一点是,如果offset参数的值非常大的话, 那么命令在返回结果之前, 需要先遍历至offset所指定的位置, 这个操作会为命令加上最多O(N)复杂度。

19. ZLEXCOUNT
ZLEXCOUNT key min max

对于一个所有成员的分值都相同的有序集合键key来说, 这个命令会返回该集合中,成员介于minmax范围内的元素数量。

20. ZREMRANGEBYLEX
ZREMRANGEBYLEX key min max

对于一个所有成员的分值都相同的有序集合键key来说,这个命令会移除该集合中,成员介于minmax范围内的所有元素。
这个命令的min参数和max参数的意义和ZRANGEBYLEX命令的min参数和max参数的意义一样。

你可能感兴趣的:(8.6 有序集合对象)