美文网首页
8.6 有序集合对象

8.6 有序集合对象

作者: 猪大金 | 来源:发表于2018-09-22 23:11 被阅读0次

    有序集合对象的编码可以是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 有序集合对象

          本文链接:https://www.haomeiwen.com/subject/urxfoftx.html