有序集(Sorted Set)

ZADD

ZADD key score member [[score member] [score member] ...]

将一个或多个member元素及其score值加入到有序集key当中。

如果某个member已经是有序集的成员,那么更新这个memberscore值,并通过重新插入这个member元素,来保证该member在正确的位置上。

score值可以是整数值或双精度浮点数。

如果key不存在,则创建一个空的有序集并执行ZADD操作。

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

对有序集的更多介绍请参见sorted set

时间复杂度:
O(M*log(N)),N是有序集的基数,M为成功添加的新成员的数量。
返回值:
被成功添加的成员的数量,不包括那些被更新的、已经存在的成员。

注解

在Redis2.4版本以前,ZADD每次只能添加一个元素。

# 添加单个元素

redis> ZADD page_rank 10 google.com
(integer) 1

# 添加多个元素

redis> ZADD page_rank 9 baidu.com 8 bing.com
(integer) 2

redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

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

redis> ZADD page_rank 10 google.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  # 没有改变
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

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

redis> ZADD page_rank 6 bing.com
(integer) 0

redis> ZRANGE page_rank 0 -1 WITHSCORES  # bing.com 元素的score值被改变
1) "bing.com"
2) "6"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

ZREM

ZREM key member [member ...]

移除有序集key中的一个或多个成员,不存在的成员将被忽略。

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

时间复杂度:
O(M*log(N)),N为有序集的基数,M为被成功移除的成员的数量。
返回值:
被成功移除的成员的数量,不包括被忽略的成员。

注解

在Redis2.4版本以前,ZREM每次只能删除一个元素。

# 测试数据

redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"
5) "google.com"
6) "10"

# 移除单个元素

redis> ZREM page_rank google.com
(integer) 1

redis> ZRANGE page_rank 0 -1 WITHSCORES
1) "bing.com"
2) "8"
3) "baidu.com"
4) "9"

# 移除多个元素

redis> ZREM page_rank baidu.com bing.com
(integer) 2

redis> ZRANGE page_rank 0 -1 WITHSCORES
(empty list or set)

# 移除不存在元素

redis> ZREM page_rank non-exists-element
(integer) 0

ZCARD

ZCARD key

返回有序集key的基数。

时间复杂度:
O(1)
返回值:
key存在且是有序集类型时,返回有序集的基数。
key不存在时,返回0
redis > ZADD salary 2000 tom  # 添加一个成员
(integer) 1
redis > ZCARD salary
(integer) 1

redis > ZADD salary 5000 jack # 再添加一个成员
(integer) 1
redis > ZCARD salary
(integer) 2

redis > EXISTS non_exists_key # 对不存在的key进行ZCARD操作
(integer) 0
redis > ZCARD non_exists_key
(integer) 0

ZCOUNT

ZCOUNT key min max

返回有序集key中,score值在minmax之间(默认包括score值等于minmax)的成员。

关于参数minmax的详细使用方法,请参考ZRANGEBYSCORE命令。

时间复杂度:
O(log(N)+M),N为有序集的基数,M为值在minmax之间的元素的数量。
返回值:
score值在minmax之间的成员的数量。
redis> ZRANGE salary 0 -1 WITHSCORES # 显示所有成员及其score值
1) "jack"
2) "2000"
3) "peter"
4) "3500"
5) "tom"
6) "5000"

redis> ZCOUNT salary 2000 5000   # 计算薪水在2000-5000之间的人数
(integer) 3

redis> ZCOUNT salary 3000 5000   # 计算薪水在3000-5000之间的人数
(integer) 2

ZSCORE

ZSCORE key member

返回有序集key中,成员memberscore值。

如果member元素不是有序集key的成员,或key不存在,返回nil

时间复杂度:
O(1)
返回值:
member成员的score值,以字符串形式表示。
redis> ZRANGE salary 0 -1 WITHSCORES # 显示所有成员及其score值
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"

redis> ZSCORE salary peter   # 注意返回值是字符串
"3500"

ZINCRBY

ZINCRBY key increment member

为有序集key的成员memberscore值加上增量increment

你也可以通过传递一个负数值increment,让score减去相应的值,比如ZINCRBY key -5 member,就是让memberscore值减去5

key不存在,或member不是key的成员时,ZINCRBY key increment member等同于ZADD key increment member

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

score值可以是整数值或双精度浮点数。

时间复杂度:
O(log(N))
返回值:
member成员的新score值,以字符串形式表示。
redis> ZSCORE salary tom
"2000"

redis> ZINCRBY salary 2000 tom   # tom加薪啦!
"4000"

ZRANGE

ZRANGE key start stop [WITHSCORES]

返回有序集key中,指定区间内的成员。

其中成员的位置按score值递增(从小到大)来排序。

具有相同score值的成员按字典序(lexicographical order)来排列。

如果你需要成员按score值递减(从大到小)来排列,请使用ZREVRANGE命令。

下标参数startstop都以0为底,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。
你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。
超出范围的下标并不会引起错误。
比如说,当start的值比有序集的最大下标还要大,或是start > stop时,ZRANGE命令只是简单地返回一个空列表。
另一方面,假如stop参数的值比有序集的最大下标还要大,那么Redis将stop当作最大下标来处理。
可以通过使用WITHSCORES选项,来让成员和它的score值一并返回,返回列表以value1,score1, ..., valueN,scoreN的格式表示。
客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
时间复杂度:
O(log(N)+M),N为有序集的基数,而M为结果集的基数。
返回值:
指定区间内,带有score值(可选)的有序集成员的列表。
redis > ZADD salary 5000 tom
(integer) 1
redis > ZADD salary 10086 boss
(integer) 1
redis > ZADD salary 3500 jack
(integer) 1

redis > ZRANGE salary 0 -1 WITHSCORES  # 显示整个有序集成员
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"

redis > ZRANGE salary 1 2 WITHSCORES   # 显示有序集下标区间1至2的成员
1) "tom"
2) "5000"
3) "boss"
4) "10086"

redis > ZRANGE salary 0 200000 WITHSCORES  # 测试end下标超出最大下标时的情况
1) "jack"
2) "3500"
3) "tom"
4) "5000"
5) "boss"
6) "10086"

redis > ZRANGE salary 200000 3000000 WITHSCORES   # 测试当给定区间不存在于有序集时的情况
(empty list or set)

ZREVRANGE

ZREVRANGE key start stop [WITHSCORES]

返回有序集key中,指定区间内的成员。

其中成员的位置按score值递减(从大到小)来排列。
具有相同score值的成员按字典序的反序(reverse lexicographical order)排列。

除了成员按score值递减的次序排列这一点外,ZREVRANGE命令的其他方面和ZRANGE命令一样。

时间复杂度:
O(log(N)+M),N为有序集的基数,而M为结果集的基数。
返回值:
指定区间内,带有score值(可选)的有序集成员的列表。
redis> ZRANGE salary 0 -1 WITHSCORES # 递增排列
1) "peter"
2) "3500"
3) "tom"
4) "4000"
5) "jack"
6) "5000"

redis> ZREVRANGE salary 0 -1 WITHSCORES  # 递减排列
1) "jack"
2) "5000"
3) "tom"
4) "4000"
5) "peter"
6) "3500"

ZRANGEBYSCORE

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回有序集key中,所有score值介于minmax之间(包括等于minmax)的成员。有序集成员按score值递增(从小到大)次序排列。

具有相同score值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。

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

可选的WITHSCORES参数决定结果集是单单返回有序集的成员,还是将有序集成员及其score值一起返回。
该选项自Redis 2.0版本起可用。

区间及无限

minmax可以是-inf+inf,这样一来,你就可以在不知道有序集的最低和最高score值的情况下,使用ZRANGEBYSCORE这类命令。

默认情况下,区间的取值使用闭区间(小于等于或大于等于),你也可以通过给参数前增加(符号来使用可选的开区间(小于或大于)。

举个例子:

ZRANGEBYSCORE zset (1 5

返回所有符合条件1 < score <= 5的成员;

ZRANGEBYSCORE zset (5 (10

返回所有符合条件5 < score < 10的成员。

时间复杂度:
O(log(N)+M),N为有序集的基数,M为被结果集的基数。
返回值:
指定区间内,带有score值(可选)的有序集成员的列表。
redis> ZADD salary 2500 jack
(integer) 0
redis> ZADD salary 5000 tom
(integer) 0
redis> ZADD salary 12000 peter
(integer) 0

redis> ZRANGEBYSCORE salary -inf +inf    # 显示整个有序集
1) "jack"
2) "tom"
3) "peter"

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

redis> ZRANGEBYSCORE salary -inf 5000 WITHSCORES # 显示工资<=5000的所有成员
1) "jack"
2) "2500"
3) "tom"
4) "5000"

redis> ZRANGEBYSCORE salary (5000 400000 # 显示工资大于5000小于400000的成员
1) "peter"

ZREVRANGEBYSCORE

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

返回有序集key中,score值介于maxmin之间(默认包括等于maxmin)的所有的成员。有序集成员按score值递减(从大到小)的次序排列。

具有相同score值的成员按字典序的反序(reverse lexicographical order)排列。

除了成员按score值递减的次序排列这一点外,ZREVRANGEBYSCORE命令的其他方面和ZRANGEBYSCORE命令一样。

时间复杂度:
O(log(N)+M),N为有序集的基数,M为结果集的基数。
返回值:
指定区间内,带有score值(可选)的有序集成员的列表。
redis > ZADD salary 10086 jack
(integer) 1
redis > ZADD salary 5000 tom
(integer) 1
redis > ZADD salary 7500 peter
(integer) 1
redis > ZADD salary 3500 joe
(integer) 1

redis > ZREVRANGEBYSCORE salary +inf -inf # 逆序排列所有成员
1) "jack"
2) "peter"
3) "tom"
4) "joe"

redis > ZREVRANGEBYSCORE salary 10000 2000 # 逆序排列薪水介于10000和2000之间的成员
1) "peter"
2) "tom"
3) "joe"

ZRANK

ZRANK key member

返回有序集key中成员member的排名。其中有序集成员按score值递增(从小到大)顺序排列。

排名以0为底,也就是说,score值最小的成员排名为0

使用ZREVRANK命令可以获得成员按score值递减(从大到小)排列的排名。

时间复杂度:
O(log(N))
返回值:
如果member是有序集key的成员,返回member的排名。
如果member不是有序集key的成员,返回nil
redis> ZRANGE salary 0 -1 WITHSCORES # 显示所有成员及其score值
1) "peter"
2) "3500"
3) "tom"
4) "4000"
5) "jack"
6) "5000"

redis> ZRANK salary tom  # 显示tom的薪水排名,第二
(integer) 1

ZREVRANK

ZREVRANK key member

返回有序集key中成员member的排名。其中有序集成员按score值递减(从大到小)排序。

排名以0为底,也就是说,score值最大的成员排名为0

使用ZRANK命令可以获得成员按score值递增(从小到大)排列的排名。

时间复杂度:
O(log(N))
返回值:
如果member是有序集key的成员,返回member的排名。
如果member不是有序集key的成员,返回nil
redis> ZADD salary 2000 jack
(integer) 1
redis> ZADD salary 5000 tom
(integer) 1
redis> ZADD salary 3500 peter
(integer) 1

redis> ZREVRANK salary peter # peter的工资排第二
(integer) 1
redis> ZREVRANK salary tom   # tom的工资最高
(integer) 0

ZREMRANGEBYRANK

ZREMRANGEBYRANK key start stop

移除有序集key中,指定排名(rank)区间内的所有成员。

区间分别以下标参数startstop指出,包含startstop在内。

下标参数startstop都以0为底,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。
你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。
时间复杂度:
O(log(N)+M),N为有序集的基数,而M为被移除成员的数量。
返回值:
被移除成员的数量。
redis> ZADD salary 2000 jack
(integer) 1
redis> ZADD salary 5000 tom
(integer) 1
redis> ZADD salary 3500 peter
(integer) 1

redis> ZREMRANGEBYRANK salary 0 1    # 移除下标0至1区间内的成员
(integer) 2

redis> ZRANGE salary 0 -1 WITHSCORES # 有序集只剩下一个成员
1) "tom"
2) "5000"

ZREMRANGEBYSCORE

ZREMRANGEBYSCORE key min max

移除有序集key中,所有score值介于minmax之间(包括等于minmax)的成员。

自版本2.1.6开始,score值等于minmax的成员也可以不包括在内,详情请参见ZRANGEBYSCORE命令。

时间复杂度:
O(log(N)+M),N为有序集的基数,而M为被移除成员的数量。
返回值:
被移除成员的数量。
redis> ZRANGE salary 0 -1 WITHSCORES # 显示有序集内所有成员及其score值
1) "tom"
2) "2000"
3) "peter"
4) "3500"
5) "jack"
6) "5000"

redis> ZREMRANGEBYSCORE salary 1500 3500 # 解雇所有薪水在1500到3500内的员工
(integer) 2

redis> ZRANGE salary 0 -1 WITHSCORES # 剩下的有序集成员
1) "jack"
2) "5000"

ZINTERSTORE

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

计算给定的一个或多个有序集的交集,其中给定key的数量必须以numkeys参数指定,并将该交集(结果集)储存到destination

默认情况下,结果集中某个成员的score值是所有给定集下该成员score值之

关于WEIGHTSAGGREGATE选项的描述,参见ZUNIONSTORE命令。

时间复杂度:
O(N*K)+O(M*log(M)),N为给定key中基数最小的有序集,K为给定有序集的数量,M为结果集的基数。
返回值:
保存到destination的结果集的基数。
redis > ZADD mid_test 70 "Li Lei"
(integer) 1
redis > ZADD mid_test 70 "Han Meimei"
(integer) 1
redis > ZADD mid_test 99.5 "Tom"
(integer) 1

redis > ZADD fin_test 88 "Li Lei"
(integer) 1
redis > ZADD fin_test 75 "Han Meimei"
(integer) 1
redis > ZADD fin_test 99.5 "Tom"
(integer) 1

redis > ZINTERSTORE sum_point 2 mid_test fin_test
(integer) 3

redis > ZRANGE sum_point 0 -1 WITHSCORES  # 显式集合内所有成员及其score值
1) "Han Meimei"
2) "145"
3) "Li Lei"
4) "158"
5) "Tom"
6) "199"

ZUNIONSTORE

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

计算给定的一个或多个有序集的并集,其中给定key的数量必须以numkeys参数指定,并将该并集(结果集)储存到destination

默认情况下,结果集中某个成员的score值是所有给定集下该成员score值之

WEIGHTS

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

如果没有指定WEIGHTS选项,乘法因子默认设置为1

AGGREGATE

使用AGGREGATE选项,你可以指定并集的结果集的聚合方式。

默认使用的参数SUM,可以将所有集合中某个成员的score值之作为结果集中该成员的score值;使用参数MIN,可以将所有集合中某个成员的最小score值作为结果集中该成员的score值;而参数MAX则是将所有集合中某个成员的最大score值作为结果集中该成员的score值。

时间复杂度:
O(N)+O(M log(M)),N为给定有序集基数的总和,M为结果集的基数。
返回值:
保存到destination的结果集的基数。
redis> ZRANGE programmer 0 -1 WITHSCORES
1) "peter"
2) "2000"
3) "jack"
4) "3500"
5) "tom"
6) "5000"

redis> ZRANGE manager 0 -1 WITHSCORES
1) "herry"
2) "2000"
3) "mary"
4) "3500"
5) "bob"
6) "4000"

redis> ZUNIONSTORE salary 2 programmer manager WEIGHTS 1 3   # 公司决定加薪。。。除了程序员。。。
(integer) 6

redis> 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"

內容目录

上一个主题

集合(Set)

下一个主题

关于本文档

本页