Redis ZRANGEBYSCORE命令

Redis ZRANGEBYSCORE命令教程

Redis 的 ZRANGEBYSCORE 命令用于返回 有序集 KEY 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。

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

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

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

Redis ZRANGEBYSCORE命令详解

语法

192.168.98.70:6379> ZRANGEBYSCORE KEY min max [WITHSCORES] [LIMIT offset count]

参数

参数 描述
KEY 有序集合的键。
min score 的最小值。
max score 的最大值。
WITHSCORES 可选,是否需要获取分数。
LIMIT 如果需要获取指定条数,需要使用该关键字。
offset 从哪条记录开始获取。
count 要获取多少条。

区间及无限

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

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

返回值

指定区间内,带有 score 值(可选)的有序集成员的列表。

时间复杂度

O(log(N)+M), N 为有序集的基数, M 为被结果集的基数。

可用版本

>= 1.0.5

案例

KEY存在

KEY 存在,返回指定分数区间的成员

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGEBYSCORE haicoder 0 100 1) "SqlServer" 2) "Mongo" 3) "Redis" 192.168.98.70:6379> DEL haicoder (integer) 1

我们首先,使用 ZADD 命令,同时向键为 haicoder 的集合插入元素 Redis,分数为 100,元素 Mongo,分数为 50,元素 Mysql,分数为 200,元素 SqlServer,分数为 10。

最后,我们使用 ZRANGEBYSCORE 命令,获取集合 haicoder 中分数在 0 到 100 之间的成员,包括 0 分和 100 分的。

开区间

使用 ( 表示分数值为开区间

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGEBYSCORE haicoder 0 (100 1) "SqlServer" 2) "Mongo" 192.168.98.70:6379> DEL haicoder (integer) 1

我们首先,使用 ZADD 命令,同时向键为 haicoder 的集合插入元素 Redis,分数为 100,元素 Mongo,分数为 50,元素 Mysql,分数为 200,元素 SqlServer,分数为 10。

最后,我们使用 ZRANGEBYSCORE 命令,获取集合 haicoder 中分数在 0 到 100 之间的成员,此时分数 100 加了 ( 修饰,即 100 是开区间,所以返回的元素列表中不包含分数为 100 的。

获取所有元素

-inf 表示最小值为无穷小,+inf 表示最大值为无穷大

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGEBYSCORE haicoder -inf +inf 1) "SqlServer" 2) "Mongo" 3) "Redis" 4) "Mysql" 192.168.98.70:6379> DEL haicoder (integer) 1

首先,我们使用 ZADD 命令,同时向键为 haicoder 的集合插入元素 Redis,分数为 100,元素 Mongo,分数为 50,元素 Mysql,分数为 200,元素 SqlServer,分数为 10。

最后,我们使用 ZRANGEBYSCORE 命令,分数设置为从无穷小开始到无穷大结束,即获取所有的元素列表。

返回分数

使用 WITHSCORES 选项,可以返回元素的分数

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGEBYSCORE haicoder -inf +inf WITHSCORES 1) "SqlServer" 2) "10" 3) "Mongo" 4) "50" 5) "Redis" 6) "100" 7) "Mysql" 8) "200" 192.168.98.70:6379> DEL haicoder (integer) 1

我们首先,使用 ZADD 命令,同时向键为 haicoder 的集合插入元素 Redis,分数为 100,元素 Mongo,分数为 50,元素 Mysql,分数为 200,元素 SqlServer,分数为 10。

最后,我们使用 ZRANGEBYSCORE 命令,分数设置为从无穷小开始到无穷大结束,即获取所有的元素列表,同时加上 WITHSCORES 选项,返回列表每个元素的分数。

返回指定索引开始的元素

使用 LIMIT 选项,可以返回指定索引开始指定元素数目的元素

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGEBYSCORE haicoder -inf +inf 1) "SqlServer" 2) "Mongo" 3) "Redis" 4) "Mysql" 192.168.98.70:6379> ZRANGEBYSCORE haicoder -inf +inf limit 2 1 1) "Redis" 192.168.98.70:6379> DEL haicoder (integer) 1

我们首先,使用 ZADD 命令,同时向键为 haicoder 的集合插入元素 Redis,分数为 100,元素 Mongo,分数为 50,元素 Mysql,分数为 200,元素 SqlServer,分数为 10。

最后,我们使用 ZRANGEBYSCORE 命令,获取所有的元素列表。 使用 ZRANGEBYSCORE 命令,获取从索引 2 开始的 1 个元素,返回了 Redis。

所有选项组合

所有选项组合,返回指定索引的指定元素数目的元素,且获取对应的分数

192.168.98.70:6379> ZADD haicoder 100 Redis 50 Mongo 200 Mysql 10 SqlServer (integer) 4 192.168.98.70:6379> ZRANGEBYSCORE haicoder 50 100 1) "Mongo" 2) "Redis" 192.168.98.70:6379> ZRANGEBYSCORE haicoder 50 100 WITHSCORES limit 1 1 1) "Redis" 2) "100" 192.168.98.70:6379> DEL haicoder (integer) 1

我们首先,使用 ZADD 命令,同时向键为 haicoder 的集合插入元素 Redis,分数为 100,元素 Mongo,分数为 50,元素 Mysql,分数为 200,元素 SqlServer,分数为 10。

接着,我们使用 ZRANGEBYSCORE 命令,获取元素的分数在 50 到 100 之间的元素列表。

最后,我们使用 ZRANGEBYSCORE 命令,获取元素的分数在 50 到 100 之间索引从 1 开始返回 1 个元素的元素列表,并且打印出其对应的分数值。

Redis ZRANGEBYSCORE命令总结

Redis 的 ZRANGEBYSCORE 命令用于返回有序集 KEY 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max)的成员。有序集成员按 score 值递增(从小到大)次序排列。Redis ZRANGEBYSCORE 命令语法:

192.168.98.70:6379> ZRANGEBYSCORE KEY min max [WITHSCORES] [LIMIT offset count]