Redis学习笔记系列(七)——基本数据类型之有序集合

5.5 有序集合(sorted-set)

5.5.1 ZADD
  • ZADD
    ZADD命令用于将指定元素及其score值添加至有序集合中,并返回新增的元素个数(除使用INCR参数的情况外),在Redis 2.4及以上版本中可一次添加一个或多个元素。当添加的元素已存在时,将会更新其score值,并根据该值重新插入到对应的位置保持正确的顺序。
    ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
    有序集合中元素的score值为一个64位浮点数值,并使用IEEE 754浮点数标准所表示。它可被表示为-(2^54) ~ (2^54)之间的整数,且可使用+inf-inf分别表示为正负无穷大值。当有序集合中有多个元素的score值相同时,将按照字典序(lexicographically)进行排序,字典序即对应的单词在字典中的先后顺序。

  • 参数
    Redis 3.0.2及以上版本支持以下参数:

    • NX:不更新已经存在的元素,只增加新元素。
    • XX:只更新已经存在的元素,不增加新元素。
    • CH:返回值由新增的元素个数变为修改的元素个数,修改的元素包括新增的元素和已存在元素中score值有更新的元素。
    • INCR:使用该参数时执行的操作类似于ZINCRBY操作,对指定元素的score值执行递增操作,并返回更新后的score值。当操作执行失败时(如使用了NXXX参数的情况下),将返回nil
      其中,NXXX参数不能同时使用。另外,使用INCR参数时与其它情况较为不同,只允许设置一个元素,并返回更新后的score值。
  • 示例

127.0.0.1:6379> ZADD zset NX 10.0 redis 5.0 mechached 
(integer) 2
127.0.0.1:6379> ZADD zset NX 11.0 redis
(integer) 0
127.0.0.1:6379> ZADD zset NX 8.5 mysql
(integer) 1
127.0.0.1:6379> ZADD zset XX CH 12.5 redis 3.5 mechached 
(integer) 2
127.0.0.1:6379> ZADD zset XX CH INCR 1.5 redis
"14"
5.5.2 ZPOPMAX / ZPOPMIN / BZPOPMAX / BZPOPMIN
  • ZPOPMAX
    ZPOPMAX命令用于移除并返回有序集合中分值(即score值)最高的参数count所指定个数的元素。若count参数未指定,其值默认为1。当count的值大于集合中元素的数量,将移除并返回全部的元素而非返回错误。
    ZPOPMAX key [count]

  • 示例

127.0.0.1:6379> ZPOPMAX zset 2
1) "redis"
2) "14"
3) "mysql"
4) "8.5"
  • ZPOPMIN
    ZPOPMIN命令与ZPOPMAX命令相似,二者区别为ZPOPMIN用于移除有序集合中分值(即score的值)最小的元素。
    ZPOPMIN key [count]

  • 示例

127.0.0.1:6379> ZPOPMIN zset 2
1) "mechached"
2) "3.5"
  • BZPOPMAX
    和列表中的BLPOP等阻塞式的命令一样,有序集合也提供了BZPOPMAXBZPOPMIN两个阻塞版的命令。
    BZPOPMAX命令用于弹出指定有序集合中score最大的元素,它将返回第一个非空有序集合中score最大的元素,而非所有有序集合中最大的元素。当给定的有序集合都为空时,将阻塞连接直到超时或有元素可被弹出。
    BZPOPMAX key [key ...] timeout
    BZPOPMAX接受一个以秒为单位的整数值timeout,用于表示当给定的集合都为空时阻塞连接等待的时长。当timeout的值为0时,表示将一直等待直到有元素可被弹出为止。timeout值只接受0或正整数值,当timeout值为负数时将返回错误。

  • 返回值
    BZPOPMAX命令将返回一个包含三个元素的数组,分别为弹出元素的有序集合键名、被弹出的元素以及被弹出的元素的score值。
    当给定的有序集合为空,且在给定timeout时间的内也没有元素可被弹出的情况下,将返回nil

  • BZPOPMIN
    BZPOPMINBZPOPMAX命令类似,二者区别为BZPOPMIN返回第一个非空有序集合中score值最小的元素。关于BZPOPMIN命令更多的介绍,请参考上文中的BZPOPMAX命令。
    BZPOPMIN key [key ...] timeout

  • 示例

127.0.0.1:6379> ZADD zset NX 10.0 redis 5.0 mechached  8.5 mysql
(integer) 3
127.0.0.1:6379> BZPOPMAX zset 2
1) "zset"
2) "redis"
3) "10"
127.0.0.1:6379> BZPOPMIN zset 2
1) "zset"
2) "mechached"
3) "5"
127.0.0.1:6379> BZPOPMAX zset 2
1) "zset"
2) "mysql"
3) "8.5"
127.0.0.1:6379> BZPOPMAX zset 2
(nil)
(2.04s)
5.5.3 ZSCORE
  • ZSCORE
    ZSCORE命令用于获取有序集合中指定元素的score值,并以字符串的形式返回。若集合中不存在该元素或集合不存在,则返回nil
    ZSCORE key member

  • 示例

127.0.0.1:6379> ZSCORE zset redis
"10"
5.5.4 ZCARD / ZCOUNT / ZLEXCOUNT
  • ZCARD
    ZCARD命令用于获取有序集合的基数(cardinality,即集合中元素的个数),若集合不存在则返回0。
    ZCARD key

  • 示例

127.0.0.1:6379> ZCARD zset
(integer) 3
  • ZCOUNT
    ZCOUNT命令用于获取score值在指定的范围内的元素个数。
    ZCOUNT key min max
    ZCOUNT的参数minmax可使用-inf+inf表示正/负无穷,并使用(表示不包括参数所指定的值。

  • 示例

127.0.0.1:6379> ZCOUNT zset 8 10
(integer) 2
127.0.0.1:6379> ZCOUNT zset -inf 10
(integer) 3
  • ZLEXCOUNT
    ZLEXCOUNT命令用于获取有序集合中以字典序排序指定范围内元素的数量。字典序的排序使用memcmp()函数实现,对集合中的元素进行逐个对比。字典序中,相同位置下较小的字符表示该成员小于另一成员,该位置字符相同的情况下将继续对比后续字符。例如,字符串"a"小于"aa"小于"b"
    使用-+分别表示正负无穷大的字符串,命令ZLEXCOUNT key - +表示以字典序列出所有的元素。
    另外,可以使用(以及[表示是否包括指定的字符串。其中,(表示为开区间,即端点不包括指定的字符串;[表示为闭区间,即端点包括指定的字符串。在示例中我们将为大家展示几个使用([的情况。
    ZLEXCOUNT key min max

  • 示例

127.0.0.1:6379> ZLEXCOUNT zset - +
(integer) 3
127.0.0.1:6379> ZLEXCOUNT zset [m +
(integer) 3
127.0.0.1:6379> ZLEXCOUNT zset [r +
(integer) 1
5.5.5 ZINCRBY
  • ZINCRBY
    ZINCRBY命令用于将有序集合中元素score的值增加increment参数所指定的值,并返回新值。若元素不存在,则认为其原值为0.0。
    ZINCRBY key increment member
    increment参数接受整型或浮点型的值,若该值为负数则将为该元素的score值减去increment的绝对值。

  • 示例

127.0.0.1:6379> ZINCRBY zset -1.3 mysql
"7.2000000000000002"
127.0.0.1:6379> ZINCRBY zset 0.4 redis
"10.4"
5.5.6 ZUNIONSTORE / ZINTERSTORE
  • ZUNIONSTORE
    ZUNIONSTORE命令用于计算由numkeys参数所指定数量的数个有序集合的并集,保存至destination参数所指定的有序集合中(若有序集合已存在将覆盖原有内容),并返回最终保存至destination指定集合中元素的个数。在默认情况下,最终结果集合中的元素的score值为其它几个集合中对应元素score值之和。
    ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
    ZUNIONSTORE接受使用WEIGHTS选项指定各个有序集合中元素score值在计算中的权重,其后续权重值的数量与集合的数量相同,且按顺序一一对应。各个集合中元素的score值将乘以对应集合的权重值,再传递至聚合函数中。在默认情况下,每个集合默认的权重都为1。
    例如指令ZUNIONSTORE dest 3 zset1 zset2 zset3 WEIGHTS 3 2 1中,有序集合zset1对应的权重值为3,在后续并集的计算中,其元素的score值都将乘以3后再传递给聚合函数处理。而zset2对应的权重值为2,zset3对应的权重值为1。
    使用AGGREGATE选项,可指定并集的聚合操作。Redis提供了三种聚合操作SUMMIN以及MAX可供选择,在默认情况下,将使用SUM聚合操作。

  • 三种聚合操作代表:

    • SUM:各集合中对应元素的score值之和。
    • MIN:各集合对应元素的score值中的最小值。
    • MAX:各集合对应元素的score值中的最大值。
  • 示例

127.0.0.1:6379> ZADD zset1 10.0 redis 5.0 mechached  8.5 mysql
(integer) 3
127.0.0.1:6379> ZADD zset2 0.4 redis 0.3 mechached 1 hbase
(integer) 3
127.0.0.1:6379> ZUNIONSTORE zset3 2 zset1 zset2 WEIGHTS 1 2 AGGREGATE SUM
(integer) 4
127.0.0.1:6379> ZSCORE zset3 redis
"10.800000000000001"
  • ZINTERSTORE
    ZINTERSTORE命令用于计算由numkeys参数所指定数量的数个有序集合的交集,保存至destination参数所指定的有序集合中(若有序集合已存在将覆盖原有内容),并返回最终保存至destination指定集合中元素的个数。在默认情况下,最终结果集合中的元素的score值为其它几个集合中对应元素score值之和。
    ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

  • 示例

127.0.0.1:6379> ZINTERSTORE zset4 2 zset1 zset2 AGGREGATE MIN
(integer) 2
127.0.0.1:6379> ZSCORE zset4 redis
"0.40000000000000002"
127.0.0.1:6379> ZSCORE zset4 mysql
(nil)
127.0.0.1:6379> ZSCORE zset4 mechached
"0.29999999999999999"
5.5.7 ZRANGE / ZRANGEBYLEX / ZRANGEBYSCORE
  • ZRANGE
    ZRANGE命令用于获取有序集合中有startstop参数所指定范围内的元素,并以其score值按从小到大的顺序返回。当存在多个元素score值相同时,将按字典序排列。
    ZRANGE key start stop [WITHSCORES]
    startstop参数为以0为开始的索引数值,即0代表第一个元素,1代表第二个元素。当值为负数时,表示相对于有序集合末尾的的偏移值,即-1代表有序集合中最后一个元素,-2代表倒数第二个元素。startstop所对应位置的元素都将被包含在返回的数据中,例如使用ZRANGE key 0 1将返回第一个和第二个元素。
    当获取的返回超出有序集合的大小时不会产生错误。当start大于有序集合的大小或start的值大于stop的值时,将会返回一个空列表。当stop的值大于有序集合的大小时,将只会获取到最后一个元素为止。
    当使用参数WITHSCORES时,返回的结果将包括各元素的score值,并以value1, score1, ..., valueN, scoreN的顺序返回。

  • 示例

127.0.0.1:6379> ZRANGE zset4 0 -1
1) "mechached"
2) "redis"
127.0.0.1:6379> ZRANGE zset4 0 -1 WITHSCORES
1) "mechached"
2) "0.29999999999999999"
3) "redis"
4) "0.40000000000000002"

*ZRANGEBYLEX
ZRANGEBYLEX用于在有序集合中所有元素score值相同的情况下返回指定范围的以字典序从小到大排序的元素。若集合中元素存在着不同的score值,则返回的结果是不确定的。
ZRANGEBYLEX key min max [LIMIT offset count]
ZRANGEBYLEX也可以使用LIMIT选项指定返回结果的偏移以及数量。

  • 示例
127.0.0.1:6379> ZRANGEBYLEX zset1 - + 
1) "mechached"
2) "hbase"
3) "mysql"
4) "redis"
  • ZRANGEBYSCORE
    ZRANGEBYSCORE命令用于获取有序集合中score值在minmax范围之间的元素,并以score值从低到高的顺序返回。当有多个元素的score值相同时将以字典序进行排序。
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
    minmax参数分别表示获取的元素中score的最小值与最大值。其中,minmax参数除了可以使用数值表示外,还可以有以下几种情况:

    • 分别使用-inf以及+inf表示正负无穷;
    • 使用(表示不包括参数所指定的值,例如:
      ZRANGEBYSCORE key (0 5表示0 < score <= 5
      ZRANGEBYSCORE key 0 (5表示0 <= score < 5
      ZRANGEBYSCORE key (0 (5表示0 < score < 5
      当使用参数LIMIT时,表示获取从offset开始的数量为count的元素。LIMIT参数的使用类似与SQL中的SELECT LIMIT offset, limit语句,例如ZRANGEBYSCORE key 0 5 LIMIT 1 2表示获取有序集合中score值在0到5范围内以从低到高的顺序排序后第2个元素起的两个元素。当count的值为负数时,将返回剩下的所有元素。
      ZRANGE相同,使用WITHSCORES参数使返回的结果包含元素对应的score值。
  • 示例

127.0.0.1:6379> ZADD zset1 10.0 redis 5.0 mechached  8.5 mysql 8.5 hbase
(integer) 4
127.0.0.1:6379> ZRANGEBYSCORE zset1 8.5 10 WITHSCORES LIMIT 2 10
1) "redis"
2) "10"
127.0.0.1:6379> ZRANGEBYSCORE zset1 8.5 10 WITHSCORES LIMIT 1 10
1) "mysql"
2) "8.5"
3) "redis"
4) "10"
127.0.0.1:6379> ZRANGEBYSCORE zset1 (8.5 10 WITHSCORES LIMIT 0 10
1) "redis"
2) "10"
5.5.8 ZREVRANGE / ZREVRANGEBYLEX / ZREVRANGEBYSCORE
  • ZREVRANGE
    ZREVRANGE命令与ZRANGE命令相似,也用于列出有序集合中指定位置的元素,但其排列顺序为按score值从高到低。当多个元素score值相同时,将按字典序逆向排序。
    ZREVRANGE key start stop [WITHSCORES]

  • 示例

127.0.0.1:6379> ZREVRANGE zset1 0 -1 WITHSCORES
1) "redis"
2) "10"
3) "mysql"
4) "8.5"
5) "hbase"
6) "8.5"
7) "mechached"
8) "5"
  • ZREVRANGEBYLEX
    ZREVRANGEBYLEX命令与ZRANGEBYLEX命令相似,它同样在score值相同的情况下以字典序返回指定返回的结果,但结果为从大到小排序。
    ZREVRANGEBYLEX key max min [LIMIT offset count]

  • 示例

127.0.0.1:6379> ZREVRANGEBYLEX zset1 + - LIMIT 1 4
1) "mysql"
2) "hbase"
3) "mechached"
  • ZREVRANGEBYSCORE
    ZREVRANGEBYSCORE命令与ZRANGEBYSCORE命令相类似,二者区别为ZREVRANGEBYSCORE命令以score值从高到低的顺序返回。
    ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

  • 示例

127.0.0.1:6379> ZREVRANGEBYSCORE zset1 10 8 WITHSCORES LIMIT 0 4
1) "redis"
2) "10"
3) "mysql"
4) "8.5"
5) "hbase"
6) "8.5"
127.0.0.1:6379> ZREVRANGEBYSCORE zset1 10 8 WITHSCORES LIMIT 1 4
1) "mysql"
2) "8.5"
3) "hbase"
4) "8.5"
5.5.9 ZRANK / ZREVRANK
  • ZRANK
    ZRANK命令用于获取元素在有序集合中按score值从小到排序后的位置,并返回以0为基准的索引值。即当返回0时,表示对应元素的score值为有序集合中的最小值。当集合中不存在指定元素或集合不存在时将返回nil
    ZRANK key member

  • 示例

127.0.0.1:6379> ZRANK zset1 redis
(integer) 3
  • ZREVRANK
    ZREVRANKZRANK命令类似,用于获取元素在有序集合中的位置,二者区别为ZREVRANK依照score值从大到小的顺序排列。
    ZREVRANK key member

  • 示例

127.0.0.1:6379> ZREVRANK zset1 redis
(integer) 0
5.5.10 ZSCAN
  • ZSCAN
    ZSCAN命令用于增量式的迭代获取集合中的所有元素。同样,ZSCAN命令是一个基于游标cursor的迭代器,每次执行后将会返回一个新的游标,以作为下一轮迭代的游标参数。
    ZSCAN key cursor [MATCH pattern] [COUNT count]

  • 示例

127.0.0.1:6379> ZSCAN zset1 0
1) "0"
2) 1) "mechached"
   2) "5"
   3) "hbase"
   4) "8.5"
   5) "mysql"
   6) "8.5"
   7) "redis"
   8) "10"
5.5.11 ZREM / ZREMRANGEBYLEX / ZREMRANGEBYRANK / ZREMRANGEBYSCORE
  • ZREM
    ZREM命令用于移除有序集合中的指定元素,并实际时间移除的元素个数。其中,不存在的元素将被忽略。当key对应的键存在但类型不为有序集合时,将返回错误。
    ZREM key member [member ...]
    在Redis 2.4及以上的版本中,ZREM支持一次移除多个元素。

  • 示例

# mysql1 不存在, 因此只删除了hbase
127.0.0.1:6379> ZREM zset1 hbase mysql1
(integer) 1

ZREMRANGEBYLEX

ZREMRANGEBYLEX命令用于移除有序集合中以字典序排序指定范围内的元素,并返回实际移除的元素数量。
ZREMRANGEBYLEX key min max

  • 示例
127.0.0.1:6379> ZREMRANGEBYLEX zset1 [m [p
(integer) 2
127.0.0.1:6379> ZRANGE zset 0 -1 WITHSCORES
(empty array)
  • ZREMRANGEBYRANK
    ZREMRANGEBYRANK命令用于移除有序集合中按score值从小到大排序后参数startstop所指定索引范围内的元素,并返回实际移除的元素个数。
    ZREMRANGEBYRANK key start stop
    当参数值为负数,代表按score值按从大到小排序后的索引值。例如-1代表score值最高的元素,-2代表score值第二高的元素。

  • 示例

127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "mechached"
2) "5"
3) "hbase"
4) "8.5"
5) "mysql"
6) "8.5"
7) "redis"
8) "10"
127.0.0.1:6379> ZREMRANGEBYRANK zset1 0 2
(integer) 3
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "redis"
2) "10"
  • ZREMRANGEBYSCORE
    ZREMRANGEBYSCORE命令用于移除有序集合中score值在参数minmax所指定范围内的元素,并返回实际移除的元素个数。
    ZREMRANGEBYSCORE key min max
    在一般情况下,ZREMRANGEBYSCORE的参数minmax所指定的范围包含值为二者的元素。为了实现不包含端点值的情况,可使用(标识,例如ZREMRANGEBYSCORE key (1 5表示移除1 < score <= 5的元素。

  • 示例

127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "mechached"
2) "5"
3) "hbase"
4) "8.5"
5) "mysql"
6) "8.5"
7) "redis"
8) "10"
127.0.0.1:6379> ZREMRANGEBYSCORE zset1 5 9
(integer) 3
127.0.0.1:6379> ZRANGE zset1 0 -1 WITHSCORES
1) "redis"
2) "10"

写在最后

如果你觉得我写的文章帮到了你,欢迎点赞、评论、分享、赞赏哦,你们的鼓励是我不断创作的动力~

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