redis基本数据类型SortedSet

一、常用命令

zset和set有着必然的联系,zset保留了set不能有重复成员的特性,区别是,zset中的元素是可以指定规则排序的,它给每个元素设置一个分数,作为排序的依据。(zset中的元素不可以重复,但是score 分数 可以重复,就和一个班里的同学学号不能重复,但考试成绩可以相同)
在这里插入图片描述
实战场景:

  1. 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
1.1 添加

zadd key score member [[score member] [score member] ...]:将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
返回值: 被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。

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

# 添加多个元素

127.0.0.1:6379> zadd page_rank 9 baidu.com 8 bing.com
(integer) 2

127.0.0.1:6379> zrange page_rank 0 -1 withscores
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 添加已存在元素,且 score 值不变

127.0.0.1:6379> zadd page_rank 10 google.com
(integer) 0

127.0.0.1:6379> zrange page_rank 0 -1 withscores  # 没有改变
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 添加已存在元素,但是改变 score 值

127.0.0.1:6379> zadd page_rank 6 bing.com
(integer) 0

127.0.0.1:6379> zrange page_rank 0 -1 withscores  # bing.com 元素的 score 值被改变
1) "bing.com"
2) "6"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"
1.2 查询指定区间内的成员

zrevrange :返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递减(从大到小)来排列。
除了成员按 score 值递减的次序排列这一点外, zrevrange 命令的其他方面和 zrange 命令一样。

zrange key start stop [withscores]:返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序。具有相同 score 值的成员按字典序(lexicographical order )来排列。如果你需要成员按 score 值递减(从大到小)来排列,请使用 zrevrange 命令。
返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。

下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
超出范围的下标并不会引起错误。
比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。
另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, …, valueN,scoreN 的格式表示。
客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。

127.0.0.1:6379> zadd sortset 1 k1 2 b2 3 j4
(integer) 3
127.0.0.1:6379> zrange sortset 0 -1
1) "k1"
2) "b2"
3) "j4"
127.0.0.1:6379> zrange sortset 0 -1 withscores
1) "k1"
2) "1"
3) "b2"
4) "2"
5) "j4"
6) "3"
127.0.0.1:6379> zrange sortset 0 -1 
1) "k1"
2) "b2"
3) "j4"
127.0.0.1:6379> zrevrange sortset 0 -1 
1) "j4"
2) "b2"
3) "k1"
1.3 查询指定score间内的成员

zrangebyscore key min max [withscores] [limit offset count]
返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。

可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。

可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。

min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。

举个例子

127.0.0.1:6379> zrangebyscore salary (1 5    #返回所有符合条件 1 < score <= 5 的成员

127.0.0.1:6379> zrangebyscore salary (5 (10   #则返回所有符合条件 5 < score < 10 的成员。
127.0.0.1:6379> ZADD salary 2500 jack                        # 测试数据
(integer) 0
127.0.0.1:6379> ZADD salary 5000 tom
(integer) 0
127.0.0.1:6379> ZADD salary 12000 peter
(integer) 0

127.0.0.1:6379> zrangebyscore salary -inf +inf               # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"

127.0.0.1:6379> zrangebyscore salary -inf +inf withscores    # 显示整个有序集及成员的 score 值
1) "jack"
2) "2500"
3) "tom"
4) "5000"
5) "peter"
6) "12000"

127.0.0.1:6379> zrangebyscore salary -inf 5000 withscores    # 显示工资 <=5000 的所有成员
1) "jack"
2) "2500"
3) "tom"
4) "5000"

127.0.0.1:6379> zrangebyscore salary (5000 400000            # 显示工资大于 5000 小于等于 400000 的成员
1) "peter"
1.4 根据score值从小到大返回元素

zrank key member:返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
排名以 0 为底,也就是说, score 值最小的成员排名为 0 。使用 zrevrank 命令可以获得成员按 score 值递减(从大到小)排列的排名。
返回值:如果 member 是有序集 key 的成员,返回 member 的排名。如果 member 不是有序集 key 的成员,返回 nil 。

127.0.0.1:6379> zrange salary 0 -1 withscores        # 显示所有成员及其 score 值
1) "peter"
2) "3500"
3) "tom"
4) "4000"
5) "jack"
6) "5000"

127.0.0.1:6379> zrange salary tom                     # 显示 tom 的薪水排名,第二
(integer) 1
1.5 返回元素的 score值

zscore key member:返回有序集 key 中,成员 member 的 score 值。
如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
返回值:member 成员的 score 值,以字符串形式表示。

127.0.0.1:6379> zrange salary 0 -1 withscores    # 测试数据
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"

redis> zscore salary peter              # 注意返回值是字符串
"3500"
1.6 返回集合个素

zcard key :返回有序集 key 的基数。
返回值:当 key 存在且是有序集类型时,返回有序集的基数。当 key 不存在时,返回 0 。

127.0.0.1:6379> zrange sortset 0 -1 withscores
1) "k1"
2) "1"
3) "b2"
4) "2"
5) "j4"
6) "3"
127.0.0.1:6379> zcard sortset
(integer) 3

zcount key min max:返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
返回值:score 值在 min 和 max 之间的成员的数量。

127.0.0.1:6379> zadd sortset1 3 k1 22 k2 33 k3
(integer) 3
127.0.0.1:6379> zcount sortset1 0 21
(integer) 1
1.7 加法

zincrby key increment member:为有序集 key 的成员 member 的 score 值加上增量 increment 。
返回值: member 成员的新 score 值,以字符串形式表示。

可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
当 key 不是有序集类型时,返回一个错误。
score 值可以是整数值或双精度浮点数。

127.0.0.1:6379> zscore salary tom
"2000"

127.0.0.1:6379> zincrby salary 2000 tom   # tom 加薪啦!
"4000"
1.8 删除

zrem key member [member ...] :移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。
返回值: 被成功移除的成员的数量,不包括被忽略的成员。

# 测试数据
127.0.0.1:6379> zrange page_rank 0 -1 withscores
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"


# 移除单个元素
127.0.0.1:6379> zrem page_rank google.com
(integer) 1

127.0.0.1:6379> zrange page_rank 0 -1 withscores
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"


# 移除多个元素
127.0.0.1:6379> zrem page_rank baidu.com bing.com
(integer) 2

127.0.0.1:6379> zrange page_rank 0 -1 withscores
(empty list or set)


# 移除不存在元素
127.0.0.1:6379> zrem page_rank non-exists-element
(integer) 0

zremrangebyrank key start stop:移除有序集 key 中,指定排名(rank)区间内的所有成员。
区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。返回值: 被移除成员的数量。

下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

127.0.0.1:6379> zadd salary 2000 jack
(integer) 1
127.0.0.1:6379> zadd salary 5000 tom
(integer) 1
127.0.0.1:6379> zadd salary 3500 peter
(integer) 1

127.0.0.1:6379> zremrangebyrank salary 0 1       # 移除下标 0 至 1 区间内的成员
(integer) 2

127.0.0.1:6379> zrange salary 0 -1 withscores    # 有序集只剩下一个成员
1) "tom"
2) "5000"

zremrangebyscore key min max :移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
返回值:被移除成员的数量。

127.0.0.1:6379> zrange salary 0 -1 withscores          # 显示有序集内所有成员及其 score 值
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"

127.0.0.1:6379> zremrangebyscore salary 1500 3500      # 移除所有薪水在 1500 到 3500 内的员工
(integer) 2
127.0.0.1:6379> zrange salary 0 -1 withscores          # 剩下的有序集成员
1) "jack"
2) "5000"
1.9 交集

zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.
返回值:保存到 destination 的结果集的基数。

127.0.0.1:6379> zadd mid_test 70 "Li Lei"
(integer) 1
127.0.0.1:6379> zadd mid_test 70 "Han Meimei"
(integer) 1
127.0.0.1:6379> zadd mid_test 99.5 "Tom"
(integer) 1

127.0.0.1:6379> zadd fin_test 88 "Li Lei"
(integer) 1
127.0.0.1:6379> zadd fin_test 75 "Han Meimei"
(integer) 1
127.0.0.1:6379> zadd fin_test 99.5 "Tom"
(integer) 1

127.0.0.1:6379> zinterstore sum_point 2 mid_test fin_test
(integer) 3

127.0.0.1:6379> zrange sum_point 0 -1 withscores     # 显示有序集内所有成员及其 score 值
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"
1.10 并集

zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。
返回值: 保存到 destination 的结果集的基数。

weights
使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子。
如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。

aggregate
使用 aggregate 选项,你可以指定并集的结果集的聚合方式。
默认使用的参数 sum ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。

127.0.0.1:6379> zrange programmer 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"

127.0.0.1:6379> zrange manager 0 -1 withscores
1) "herry"
2) "2000"
3) "mary"
4) "3500"
5) "bob"
6) "4000"

127.0.0.1:6379> zunionstore salary 2 programmer manager weights 1 3   # 公司决定加薪。。。除了程序员。。。
(integer) 6

127.0.0.1:6379> zrange salary 0 -1 withscores
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"
7) "herry"
8) "6000"
9) "mary"
10) "10500"
11) "bob"
12) "12000"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值