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参数的意义一样。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Key(键) 1. DEL 时间复杂度:O(N), N 为被删除的 key 的数量。删除单个字符串类型的 key...
    one_zheng阅读 530评论 0 0
  • Redis key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个...
    壹点零阅读 1,404评论 0 2
  • 本文为笔者对在学习Redis过程中所收集资料的一个总结,目的是为了以后方便回顾相关的知识,大部分为非原创内容。特此...
    EakonZhao阅读 14,404评论 0 9
  • Redis是啥 Redis是一个开源的key-value存储系统,由于拥有丰富的数据结构,又被其作者戏称为数据结构...
    一凡呀阅读 1,170评论 0 5
  • 最近在追一部台剧《同乐会》,里面有一对夫夫Alex&Benny。 有一幕戏,Alex和Benny在床上翻云覆雨,B...
    一只萤火虫阅读 488评论 0 2