Redis数据类型 - 有序集合(Sorted set)

一、有序集合简介

Redis有序集合,顾名思义是一种可以使存放的元素有序的集合,这种数据结构中的每一个元素都由一个成员和一个与成员相关联的分值组成,其中成员以字符串方式存储,而分值则以64位双精度浮点数格式存储。
在这里插入图片描述
与集合一样,有序集合中的每个元素都是不重复的。有序集合的分值除了可以是数字之外,还可以是字符串+“inf"或者”-inf",inf是infinite(无限)的缩写,因此这两个特殊的分值表示无穷大和无穷小。

当多个成员的分值相同时,Redis将按照这些成员在字典序中的大小对其进行排列:例如成员apple和成员zero都拥有相同的分值100,那么Redis将认为成员apple小于成员zero,因为在字典序中,字母a开头的单词要小于字母z开头的单词。

二、有序集合常用操作

  • 添加或更新成员

通过使用ZADD命令,用户可以向有序集合添加一个或多个新成员
语法格式:ZADD key score1 member1 score2 member2 …,

# 向有序集合scores中添加4个元素,分别是分值为67的tom,
# 分值为74的Peter,分值为65的jack,和分值为82的mary
ZADD scores 67 'tom' 74 'peter' 65 'jack' 82 'mary'

如果在ZADD命令中,给定成员已经存在于有序集合中,并且给定的分值和成员现有的分值并不相同,那么ZADD命令将使用新的分值覆盖旧分值。

从Redis3.0.2开始,在执行ZADD命令时,可通过可选参数XX或者NX来显示的指示命令只执行更新操作或者只执行添加操作。

默认情况下,ZADD命令会返回新添加成员的数量作为返回值,但是从3.0.2版开始,可以通过CH选项,让ZADD命令返回被修改成员的数量作为返回值。如

# 修改scores有序集合中元素tom的分值为77,并指定返回修改成员的数量作为返回值
ZADD scores CH 77 'tom'

  • 移除指定的成员

和集合的SREM命令相似,有序集合的移除命令为ZREM,可从有序集合中移除指定的一个或多个成员以及这些成员相关联的分值
语法格式:ZREM key member1 member2 …,如

# 移除有序集合scores中的tom和peter
ZREM scores 'tom' 'peter'

ZREM 命令会返回被移除成员的数量作为返回值,如果给定的某个成员并不存在于有序集合中,那么ZREM将自动忽略

  • 弹出分值最高或最低的成员

ZPOPMAX和ZPOPMIN是Redis 5.0版本新添加的两个命令,分别用于移除并返回有序集合中分值最大和最小的N个元素
语法格式:
ZPOPMAX key [count]
ZPOPMIN key [count]
其中被移除元素的数量可以通过可选的count参数来指定。如果用户没有显式地给定count参数,那么命令默认只会移除一个元素。

除此之外,分别还有对应的阻塞版本BZPOPMAX命令和BZPOPMIN命令,这两个阻塞命令都接受任意多个有序集合和一个秒级精度的超时时限作为参数
语法格式:
BZPOPMAX key1 key2 … timeout
BZPOPMIN key1 key2 … timeout

接收到参数的BZPOPMAX命令和BZPOPMIN命令会依次检查用户给定的有序集合,并从它遇到的第一个非空有序集合中弹出指定的元素。如果命令在检查了所有给定有序集合之后都没有发现可弹出的元素,那么它将阻塞执行命令的客户端,并在给定的时限之内等待可弹出的元素出现,直到等待时间超过给定时限为止。用户可以通过将超时时限设置为0来让命令一直阻塞,直到可弹出的元素出现为止。

  • 获取成员的分值

通过使用ZSCORE命令,可以获取指定成员相关联的分值
预防格式:ZSCORE key member,如

# 获取tom的分值
ASCORE scores tom

如果给定的有序集合并不存在或者成员不存在,那么ZSCORE命令将返回空值

  • 对成员的分值进行自增或自减操作

与字符串的INCRBY命令相似,有序集合拥有一个ZINCRBY命令,可用来对有序集合中指定成员的分值执行自增操作,如果想要实现减少,在指定的分值前添加负号即可
语法格式:ZINCRBY key increment member,如

# 将Peter的分值增加10
ZINCRBY scores 10 'peter'

# 将Peter的分值减少5
ZINCRBY scores -5 'peter'

如果给定的有序集合不存在或者成员不存在于有序集合中,那么INCRBY命令将直接把给定的成员添加到有序集合中,并把给定的增量设置为该成员的分值

  • 获取有序集合中成员的数量

通过使用ZCARD命令可取得有序集合中成员的数量
语法格式:ZCARD key ,如

# 获取scores中成员的数量
ZCARD scores 

如果给定的集合不存在,ZCARD命令将返回0作为结果

  • 获取成员在有序集合中的排名

有序集合,自然一大功能就是方便获取排名,通过ZRANK命令和ZREVRANK命令可获取指定成员在有序集合中的排名,两者的区别是ZRANK命令返回的是成员的升序排名,而ZREVRANK获取的是降序排名
语法格式:ZRANK key member,如

# 获取Peter在有序集合中的正序排名(分输站从小到大的排名)
ZRANK scores 'peter'

# 获取Peter在有序集合中的逆序排名(分数值从大到小的排名)
ZREVRANK scores 'peter'

如果给定的有序集合不存在,或指定成员不存在于有序集合中,那么ZRANK命令和ZREVRANK命令将返回一个空值

  • 获取指定分值范围内的成员

通过使用ZRANGEBYSCORE命令和ZREVRANGEBYSCORE命令,用户可以以升序或降序排列的方式获取有序集合中分值介于指定范围内的成员
语法格式:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
[WITHSCORES]为可选参数,携带该参数时表明同时也获取成员的分值;而LIMIT选项则是用于限制返回的成员数量,其中offset参数用于指定命令在返回结果之前需要跳过的成员数量,而count参数则用于指示命令最多可以返回多少个成员

# 以正序方式获取scores中分值在60到80的所有成员,同时获取分值,
# 并且跳过1个,最多返回两个成员
ZRANGEBYSCORE scores 60 80 WITHSCORES LIMIT 1 2

在默认情况下,ZRANGEBYSCORE命令和ZREVRANGEBYSCORE命令接受的都是闭区间分值范围,也就是说等于最大分值和最小分值的成员也会包含在返回结果中。如果想要定义的是开区间,那么在给定分值范围时,在分值参数的前面加上一个单括号即可,如

# 以正序方式获取scores中分值在60到80的所有成员(不包含等于60和80的成员),同时获取分值,
# 并且跳过1个,最多返回两个成员
ZRANGEBYSCORE scores (60 (80 WITHSCORES LIMIT 1 2

在指定分值范围时,也可以使用 +inf 和 -inf 来作为范围

  • 获取指定分值范围内的成员数量

通过使用COUNT命令,可以获取有序集合中分值介于指定范围内的成员数量
语法格式:ZCOUNT key min max,如

# 获取scores中分值介于60到80内的成员数量
ZCOUNT scores 60 80
  • 获取指定索引范围内的成员

通过ZRANGE命令或ZREVRANGE命令,用户可以以升序排列或降序排列的方式,从有序集合中获取指定索引范围内的成员
语法格式:
ZRANGE key start end [WITHSCORES]
ZREVRANGE key start end [WITHSCORES]

start 和 end 同样可指定为正向索引或负向索引,[WITHSCORES]为可选参数,携带该参数时表明同时也获取成员的分值

如果给定的有序集合不存在,那么ZRANGE命令和ZREVRANGE命令将返回一个空列表

  • 移除指定排名范围内的成员

ZREMRANGEBYRANK命令可以从升序排列的有序集合中移除位于指定排名范围内的成员,然后返回被移除成员的数量
语法格式:ZREMRANGEBYRANK key start end,如

# 移除scores中升序排列中的前三个成员
ZREMRANGEBYRANK scores 0 2

传给ZREMRANGEBYRANK命令的排名参数也可以是负数,此时就是负数索引的意思

  • 移除指定分值范围内的成员

ZREMRANGEBYSCORE命令可以从有序集合中移除位于指定分值范围内的成员,并在移除操作执行完毕后返回被移除成员的数量
语法格式:ZREMRANGEBYRANK key min max

ZREMRANGEBYSCORE命令接受的分值范围与ZRANGEBYSCORE命令和ZCOUNT命令接受的分值范围一样,都默认为闭区间分值范围,但用户可以使用(符号定义闭区间,或者使用+inf和-inf表示正无限分值或者负无限分值。

  • 有序集合的并集运算和交集运算

与集合一样,Redis也为有序集合提供了相应的并集运算命令ZUNIONSTORE和交集运算命令ZINTERSTORE
语法格式:
ZUNIONSTORE destination numbers key1 key2 … [WEIGHTS weight [weight …]]
[AGGREGATE SUM|MIN|MAX]
ZINTERSTORE destination numbers key1 key2 … [WEIGHTS weight [weight …]]
[AGGREGATE SUM|MIN|MAX]
其中,numbers用于指明参与计算的有序集合的数量,计算得出的结果会存储到destination当中,而可选参数[AGGREGATE SUM|MIN|MAX]可以决定使用哪个聚合函数来计算结果有序集合成员的分值
在这里插入图片描述
在使用WEIGHTS选项时,用户需要为每个给定的有序集合分别设置一个权重,命令会将这个权重与成员的分值相乘,得出成员的新分值,然后执行聚合计算;与此相反,如果用户在使用WEIGHTS选项时,不想改变某个给定有序集合的分值,那么只需要将那个有序集合的权重设置为1即可。

ZUNIONSTORE命令和ZINTERSTORE命令都会返回计算结果包含的成员数量作为返回值。

ZUNIONSTORE和ZINTERSTORE除了可以使用有序集合作为输入之外,还可以使用集合作为输入:在默认情况下,这两个命令将把给定集合看作所有成员的分值都为1的有序集合来进行计算。如果有需要,用户也可以使用WEIGHTS选项来改变给定集合的分值,比如,如果你希望某个集合所有成员的分值都被看作10而不是1,那么只需要在执行命令时把那个集合的权重设置为10即可。

三、字典序相关操作

  • 返回指定字典序范围内的成员

当有序集合的所有成员都拥有相同的分值时,有序集合的成员将不再根据分值进行排序,而是根据字典序进行排序。为了让用户可以对字典序排列的有序集合执行类似ZRANGEBYSCORE这样的操作,Redis提供了相应的ZRANGEBYLEX、ZREVRANGEBYLEX、ZLEXCOUNT和ZREMRANGEBYLEX命令,这些命令可以分别对字典序排列的有序集合执行升序排列的范围获取操作、降序排列的范围获取操作、统计位于字典序指定范围内的成员数量以及移除位于字典序指定范围内的成员。

ZRANGEBYLEX语法格式:ZRANGEBYLEX key min max [LIMIT offset count]

其中,命令的min参数和max参数用于指定用户想要获取的字典序范围,它们的值可以是以下4种值之一:
·带有[符号的值表示在结果中包含与给定值具有同等字典序大小的成员。
·带有(符号的值表示在结果中不包含与给定值具有同等字典序大小的成员。
·加号+表示无穷大。
·减号-表示无穷小。

# 获取scores中的所有成员,并按字典序排序
ZRANGEBYLEX scores - +

# 获取scores有序集合中所有以字母a开头的成员
ZRANGEBYLEX scores [a (b

# 获取scores有序集合中所有以字母a、b开头的成员
ZRANGEBYLEX scores - (c

ZREVRANGEBYLEX语法格式:ZREVRANGEBYLEX key max min [LIMIT offset count]

ZREVRANGEBYLEX命令是ZRANGEBYLEX 的逆序版

与有序集合的其他范围型获取命令一样,ZRANGEBYLEX和ZREVRANGEBYLEX也可以通过可选的LIMIT选项来限制命令返回的成员数量

  • 统计位于字典序指定范围内的成员数量

对于按照字典序排列的有序集合,用户可以使用ZLEXCOUNT命令统计有序集合中位于字典序指定范围内的成员数量
语法格式:ZLEXCOUNT key min max,如

# 统计出scores中以字母a开头的成员数量
ZLEXCOUNT scores [a (b
  • 移除位于字典序指定范围内的成员

对于按照字典序排列的有序集合,用户可以使用ZREMRANGEBYLEX命令去移除有序集合中位于字典序指定范围内的成员:
语法格式:ZREMRANGEBYLEX key min max

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值