首页 > 编程笔记 > Redis笔记 阅读:14

Redis有序集合操作命令大全(附带实例)

Redis 中,有序集合(Sorted Set)是一种存储唯一元素的集合,其中的每个元素都会关联一个浮点数分数(score),这使得元素能够根据分数进行排序。

有序集合非常适合实现排行榜、带权重的元素列表等功能。

有序集合基本操作

1) 返回有序集合中指定成员的排名,有序集合成员按分数值递减排序

ZREVRANK 命令的作用是返回有序集合中成员的排名,其中,有序集合成员按分数值递减排序。该命令的排名从 0 开始,也就是说,分数值最大的成员排名为 0。

ZREVRANK 命令的语法格式如下:
ZREVRANK key member
如果参与排序的成员是有序集合的成员,则返回该成员的排名;如果参与排序的成员不是有序集合的成员,则返回 nil。

例如:
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES     # 测试数据
"Jack"
"2000"
"Peter"
"3500"
"Tom"
"5000"
127.0.0.1:6379> ZREVRANK salary peter             # Peter 的工资排第二
(integer) 1
127.0.0.1:6379> ZREVRANK salary tom               # Tom 的工资最高
(integer) 0

2) 在有序集合中计算指定字典区间内的成员数量

ZLEXCOUNT 命令的作用是在计算有序集合中指定字典区间内成员数量。

ZLEXCOUNT 命令的语法格式如下:
ZLEXCOUNT key min max
命令返回指定区间内的成员数量。

例如:
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e
(integer) 5
127.0.0.1:6379> ZADD myzset 0 f 0 g
(integer) 2
# “ - ”表示得分最小值的成员,“ + ”表示得分最大值的成员
127.0.0.1:6379> ZLEXCOUNT myzset - +
(integer) 7
127.0.0.1:6379> ZLEXCOUNT myzset [b [f
(integer) 5

3) 计算给定的一个或多个有序集合的并集,并将其存储在新的key中

ZUNIONSTORE 命令的作用是计算给定的一个或多个有序集合的并集,其中,给定 key 的数量必须以 numkeys 参数进行指定,并将该并集(结果集)储存到 destination 集合中。

在默认情况下,并集中某个成员的分数值是所有给定集合中该成员分数值之和。

ZUNIONSTORE 命令的语法格式如下:
ZUNIONSTORE destination numkeys key [key…] [WEIGHTS weight [weight…]] [aggregate sum | min | max]
命令返回保存到 destination 集合的并集的成员数量。

例如:
127.0.0.1:6379> ZRANGE programmer 0 -1 WITHSCORES
"Peter"
"2000"
"Jack"
"3500"
"Tom"
"5000"
127.0.0.1:6379> ZRANGE manager 0 -1 WITHSCORES
"Herry"
"2000"
"Mary"
"3500"
"Bob"
"4000"
127.0.0.1:6379> ZUNIONSTORE salary 2 programmer manager WEIGHTS
# 公司决定加薪……除了程序员……
(integer) 6
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES
"Peter"
"2000"
"Jack"
"3500"
"Tom"
"5000"
"Herry"
"6000"
"Mary"
"10500"
"Bob"
"12000"

4) 移除有序集合中给定排名区间内的所有成员元素

ZREMRANGEBYRANK 命令的作用是移除有序集合中指定排名区间内的所有成员。

ZREMRANGEBYRANK 命令的语法格式如下:
ZREMRANGEBYRANK key start stop
此命令返回被移除成员的数量。

例如:
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
# 有序集合只剩下一个成员
"Tom"
"5000"

5) 获取有序集合的成员元素数

ZCARD 命令的作用是计算集合中成元素的数量。

ZCARD 命令的语法格式如下:
ZCARD key_name
当 key 存在且是有序集合类型时,返回有序集合的基数;当 key 不存在时,返回 0。

例如:
127.0.0.1:6379> ZADD myset 1 "hello"
(integer) 1
127.0.0.1:6379> ZADD myset 1 "foo"
(integer) 1
127.0.0.1:6379> ZADD myset 2 "world" 3 "bar"
(integer) 2
127.0.0.1:6379> ZCARD myzset
(integer) 4

6) 移除有序集合中的一个或多个成员元素

ZREM 命令的作用是移除有序集合中的一个或多个成员元素,不存在的成员将被忽略。

当 key 存在但不是有序集合类型时,返回一个错误信息。

ZREM 命令的语法格式如下:
ZREM key member [member …]
命令返回被成功移除的成员元素的数量,该数量不包括被忽略的成员元素的数量。

例如:
# 测试数据
127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
"test 1.com"
"8"
"test 2.com"
"9"
"test 3.com"
"10"
# 移除单个元素
127.0.0.1:6379> ZREM page_rank test 3.com
(integer) 1
127.0.0.1:6379> ZRANGE page_rank 0 -1 WITHSCORES
"test 1.com"
"8"
"test 2.com"
"9"
# 移除多个成员元素
127.0.0.1:6379> ZREM page_rank test 1.com test 2.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

7) 计算给定的一个或多个有序集合的交集,并将该集合存储在新的有序集合key中

ZINTERSTORE 命令的作用是计算给定的一个或多个有序集合的交集,其中,给定 key 的数量必须以 numkeys 参数来指定,并将该交集储存到 destination 集合中。

在默认情况下,交集中某个成员元素的分数值是所有给定集合中该成员分数值之和。

ZINTERSTORE 命令的语法格式如下:
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight[weight …]] [aggregate sum | min | max]
此命令返回保存到 destination 集合的成员元素数量。

例如:
# 有序集合mid_test
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
# 另一个有序集合fin_test
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
"Han Meimei"
"145"
"Li Lei"
"158"
"Tom"
"199"

8) 返回有序集合中指定成员元素的排名

ZRANK 命令的作用是返回有序集合中指定成员的排名,其中,有序集合成员元素按分数值递增排列。

ZRANK 命令的语法格式如下:
ZRANK key member
如果成员是有序集合 key 的成员元素,返回该成员的排名;如果成员元素不是有序集合的成员,则返回 nil。

例如:
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES
# 显示所有成员及其 score 值
"Peter"
"3500"
"Tom"
"4000"
"Jack"
"5000"
127.0.0.1:6379> ZRANK salary tom    # 显示Tom的薪水排名(第二)
(integer) 1

9) 为有序集合中指定成员的分数加上增量

ZINCRBY 命令的作用是为有序集合中指定成员的分数加上增量。该命令可以通过传递一个负值增量让分数减去相应的值,比如 ZINCRBY Key-5member 的作用就是为 member (成员)的 score 值(分数)减去 5。

当 key 不存在或分数不是 key 的成员时,ZINCRBY key increment member 的作用等同于 ZADD key increment member 的作用。

当 key 不是有序集合类型时,返回一个错误信息。

这里的分数值可以是整数值或双精度浮点值。

ZINCRBY 命令的语法格式如下:
ZINCRBY key increment member
命令返回 member 成员的新分数值,该值以字符串形式表示。

例如:
127.0.0.1:6379> ZADD myzset 1 "hello"
(integer) 1
127.0.0.1:6379> ZADD myzset 1 "foo"
(integer) 1
127.0.0.1:6379> ZINCRBY myzset 2 "hello"
(integer) 3
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
"foo"
"1"
"hello"
"3"

10) 通过分数返回有序集合指定区间内的成员

ZRANGEBYSCORE 命令的作用是返回有序集合中指定分数区间的成员列表。有序集合成员按分数大小递增排列。具有相同分数的成员按字典序来排列(该属性是有序集合提供的,不需要额外的计算)。

ZRANGEBYSCORE 命令的语法格式如下:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
命令返回指定区间内带有分数值(可选)的有序集合成员的列表。

例如:
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
# 显示整个有序集合
"Jack"
"Tom"
"Peter"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf WITHSCORES
# 显示整个有序集合及成员的 score 值
"Jack"
"2500"
"Tom"
"5000"
"Peter"
"12000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES
# 显示工资小于或等于5000的所有成员
"Jack"
"2500"
"Tom"
"5000"
127.0.0.1:6379> ZRANGEBYSCORE salary (5000 12000
# 显示工资大于5000小于或等于12000的成员
"Peter"
在默认情况下,区间的取值使用闭区间(小于或等于、大于或等于。开区间(小于或大于)可以通过给参数前增加“(”来实现。

例如代码:
ZRANGEBYSCORE zset (1 5
的作用是返回所有符合条件 1 < score ≤ 5 的成员,而代码:
ZRANGEBYSCORE zset (5 (10
的作用是返回所有符合条件 5 < score < 10 的成员。

11) 通过字典区间返回有序集合的成员

ZRANGEBYLEX 命令的作用是通过字典区间返回有序集合的成员。

ZRANGEBYLEX 命令的语法格式如下:
ZRANGEBYLEX key min max [LIMIT offset count]
命令返回指定区间内的元素列表。

例如:
127.0.0.1:6379> ZADD myzset 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 7
127.0.0.1:6379> ZRANGEBYLEX myzset - [c
"a"
"b"
"c"
127.0.0.1:6379> ZRANGEBYLEX myzset - (c
"a"
"b"
127.0.0.1:6379> ZRANGEBYLEX myzset [a (g
"b"
"c"
"d"
"e"
"f"

12) 返回有序集合中成员的分数值

ZSCORE 命令的作用是返回有序集合中成员的分数值。如果成员元素不是有序集合 key 的成员或 key 不存在,则返回 nil。

ZSCORE 命令的语法格式如下:
ZSCORE key member
命令返回成员的分数,该值以字符串形式表示。

例如:
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES    # 测试数据
"Tom"
"2000"
"Peter"
"3500"
"Jack"
"5000"
127.0.0.1:6379> ZSCORE salary Peter              # 注意返回值是字符串
"3500"

13) 移除有序集合中指定分数区间内的所有成员

ZREMRANGEBYSCORE 命令的作用是移除有序集合中,指定分数区间内的所有成员。

ZREMRANGEBYSCORE 命令的语法格式如下:
ZREMRANGEBYSCORE key min max
命令返回被移除成员的数量。

例如:
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES
# 显示有序集合内所有成员及其分数
"Tom"
"2000"
"Peter"
"3500"
"Jack"
"5000"
127.0.0.1:6379> ZREMRANGEBYSCORE salary 1500 3500
# 移除所有薪水在1500~3500内的员工
(integer) 2
redis> ZRANGE salary 0 -1 WITHSCORES        # 剩下的有序集合成员
"Jack"
"5000"

14) 迭代有序集合中的元素

ZSCAN 命令的作用是迭代有序集合中的元素(包括元素成员和元素分值)。

ZSCAN 命令的语法格式如下:
ZSCAN key cursor [MATCH pattern] [COUNT count]
命令返回的每个元素都是一个有序集合元素,一个有序集合元素由一个成员(Member)和一个分数(Score)组成。

15) 返回有序集合中指定分数区间内的成员元素,按分数从高到低进行排序

ZREVRANGEBYSCORE 返回有序集合中指定分数区间内的所有的成员。有序集合成员按分数值递减(从大到小)的次序排列。具有相同分数值的成员按字典序的逆序排列。

除了成员按分数递减的顺序排列这一点外,ZREVRANGEBYSCORE 命令的其他作用和 ZRANGEBYSCORE 命令一样。

ZREVRANGEBYSCORE 命令的语法格式如下:
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
命令返回指定区间内,带有分数(可选)的有序集合成员的列表。

例如:
127.0.0.1:6379> ZADD salary 10086 Jack
(integer) 1
redis > ZADD salary 5000 Tom
(integer) 1
127.0.0.1:6379> ZADD salary 7500 Peter
(integer) 1
127.0.0.1:6379> ZADD salary 3500 Joe
(integer) 1
127.0.0.1:6379> ZREVRANGEBYSCORE salary + inf - inf
# 按工资降序排列所有成员元素
"Jack"
"Peter"
"Tom"
"Joe"
127.0.0.1:6379> ZREVRANGEBYSCORE salary 10000 2000
"Peter"
"Tom"
"Joe"

16) 移除有序集合中指定字典区间内的所有成员

ZREMRANGEBYLEX 命令的作用是移除有序集合中指定字典区间内的所有成员。

ZREMRANGEBYLEX 命令的语法格式如下:
ZREMRANGEBYLEX key min max
命令返回被成功移除的成员的数量,该数量不包括被忽略的成员数量。

例如:
127.0.0.1:6379> ZADD myzset 0 aaaa 0 b 0 c 0 d 0 e
(integer) 5
127.0.0.1:6379> ZADD myzset 0 foo 0 zap 0 zip 0 ALPHA 0 alpha
(integer) 5
127.0.0.1:6379> ZRANGE myzset 0 -1
"ALPHA"
"aaaa"
"alpha"
"b"
"c"
"d"
"e"
"foo"
"zap"
"zip"
127.0.0.1:6379> ZREMRANGEBYLEX myzset [alpha [omega
(integer) 6
127.0.0.1:6379> ZRANGE myzset 0 -1
"ALPHA"
"aaaa"
"zap"
"zip"
redis>

17) 返回有序集合中指定区间内的成员元素,并通过索引对成员元素按分数从高到低进行排序

ZREVRANGE 命令的作用是返回有序集合中指定区间内的成员,其中,成员的位置按分数递减来排列,具有相同分数值的成员按字典序的逆序排列。

除了成员按分数递减的顺序排列这一点外,ZREVRANGE 命令的其他作用和 ZRANGE 命令一样。

ZREVRANGE 命令的语法格式如下:
ZREVRANGE key start stop [WITHSCORES]
命令返回指定区间内,带有分数(可选)的有序集合成员的列表。

例如:
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES       # 递增排列
"Peter"
"3500"
"Tom"
"4000"
"Jack"
"5000"
127.0.0.1:6379> ZREVRANGE salary 0 -1 WITHSCORES    # 递减排列
"Jack"
"5000"
"Tom"
"4000"
"Peter"
"3500"

18) 通过索引区间返回有序集合中指定区间内的成员

ZRANGE 命令的作用是返回有序集合中指定索引区间内的成员,其中,成员的位置按分数递增来排序,具有相同分数的成员按字典序来排列。

ZRANGE 命令的语法格式如下:
ZRANGE key start stop [WITHSCORES]
命令返回指定索引区间内,带有分数(可选)的有序集合成员的列表。

下标参数 start 和 stop 都以 0 为底,也就是说,用 0 表示有序集合第一个成员,用 1 表示有序集合第二个成员,依次类推。

下标也可以使用负数,用 -1 表示最后一个成员,用 -2 表示倒数第二个成员,依次类推。

例如:
127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES
# 显示整个有序集合成员
"Jack"
"3500"
"Tom"
"5000"
"Boss"
"10086"
127.0.0.1:6379> ZRANGE salary 1 2 WITHSCORES
# 显示有序集合下标区间1至2的成员
"Tom"
"5000"
"Boss"
"10086"
127.0.0.1:6379> ZRANGE salary 0 200000 WITHSCORES
# 测试end下标超出最大下标时的情况
"Jack"
"3500"
"Tom"
"5000"
"Boss"
"10086"
redis > ZRANGE salary 200000 3000000 WITHSCORES
# 测试当给定区间在有序集合中不存在时的情况
(empty list or set)

19) 计算在有序集合中指定分数区间内的成员数量

ZCOUNT 命令的作用是计算有序集合中指定分数区间内的成员数量。

ZCOUNT 命令的语法格式如下:
ZCOUNT key min max
命令返回分数在最小值(min)和最大值(max)之间的成员数量。

例如:
127.0.0.1:6379> ZADD myzset 1 "hello"
(integer) 1
127.0.0.1:6379> ZADD myzset 1 "foo"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "world" 3 "bar"
(integer) 2
127.0.0.1:6379> ZCOUNT myzset 1 3
(integer) 4

20) 向有序集合添加一个或多个成员,或者更新已存在成员的分数

ZADD 命令的作用是将一个或多个成员及其分数值加入到有序集合中。如果某个成员已经是有序集合的成员,那么更新这个成员的分数值,并通过重新插入这个成员来保证该成员在正确的位置上。这里的分数可以是整型数或双精度浮点数。

如果有序集合 key 不存在,则创建一个空的有序集合并执行 ZADD 操作。当 key 存在但不是有序集合类型时,返回一个错误信息。

ZADD 命令的语法格式如下:
ZADD key_name score1 value1…scoren valuen
命令返回被成功添加的新成员的数量,该数量不包括那些被更新的、已经存在的成员数量。

例如:
127.0.0.1:6379> ZADD myset 1 "hello"
(integer) 1
127.0.0.1:6379> ZADD myset 1 "foo"
(integer) 1
127.0.0.1:6379> ZADD myset 2 "world" 3 "bar"
(integer) 2
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
"hello"
"1"
"foo"
"1"
"world"
"2"
"bar"
"3"

相关文章