Redis有序集合操作命令大全(附带实例)
在 Redis 中,有序集合(Sorted Set)是一种存储唯一元素的集合,其中的每个元素都会关联一个浮点数分数(score),这使得元素能够根据分数进行排序。
有序集合非常适合实现排行榜、带权重的元素列表等功能。
ZREVRANK 命令的语法格式如下:
例如:
ZLEXCOUNT 命令的语法格式如下:
例如:
在默认情况下,并集中某个成员的分数值是所有给定集合中该成员分数值之和。
ZUNIONSTORE 命令的语法格式如下:
例如:
ZREMRANGEBYRANK 命令的语法格式如下:
例如:
ZCARD 命令的语法格式如下:
例如:
当 key 存在但不是有序集合类型时,返回一个错误信息。
ZREM 命令的语法格式如下:
例如:
在默认情况下,交集中某个成员元素的分数值是所有给定集合中该成员分数值之和。
ZINTERSTORE 命令的语法格式如下:
例如:
ZRANK 命令的语法格式如下:
例如:
当 key 不存在或分数不是 key 的成员时,ZINCRBY key increment member 的作用等同于 ZADD key increment member 的作用。
当 key 不是有序集合类型时,返回一个错误信息。
这里的分数值可以是整数值或双精度浮点值。
ZINCRBY 命令的语法格式如下:
例如:
ZRANGEBYSCORE 命令的语法格式如下:
例如:
例如代码:
ZRANGEBYLEX 命令的语法格式如下:
例如:
ZSCORE 命令的语法格式如下:
例如:
ZREMRANGEBYSCORE 命令的语法格式如下:
例如:
ZSCAN 命令的语法格式如下:
除了成员按分数递减的顺序排列这一点外,ZREVRANGEBYSCORE 命令的其他作用和 ZRANGEBYSCORE 命令一样。
ZREVRANGEBYSCORE 命令的语法格式如下:
例如:
ZREMRANGEBYLEX 命令的语法格式如下:
例如:
除了成员按分数递减的顺序排列这一点外,ZREVRANGE 命令的其他作用和 ZRANGE 命令一样。
ZREVRANGE 命令的语法格式如下:
例如:
ZRANGE 命令的语法格式如下:
下标参数 start 和 stop 都以 0 为底,也就是说,用 0 表示有序集合第一个成员,用 1 表示有序集合第二个成员,依次类推。
下标也可以使用负数,用 -1 表示最后一个成员,用 -2 表示倒数第二个成员,依次类推。
例如:
ZCOUNT 命令的语法格式如下:
例如:
如果有序集合 key 不存在,则创建一个空的有序集合并执行 ZADD 操作。当 key 存在但不是有序集合类型时,返回一个错误信息。
ZADD 命令的语法格式如下:
例如:
有序集合非常适合实现排行榜、带权重的元素列表等功能。
有序集合基本操作
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"