ZRANGE
ZRANGE 命令返回存储在键 key 的有序集合中,指定范围内的成员。
从 Redis 6.2.0 开始,ZRANGE 命令支持 BYSCORE、BYLEX 和 REV 选项,可以替代 ZREVRANGE、ZRANGEBYSCORE、ZREVRANGEBYSCORE、ZRANGEBYLEX 和 ZREVRANGEBYLEX 命令。
ZRANGE 命令的时间复杂度为 O(log(N)+M),其中 N 是有序集合中的元素数量,M 是返回的元素数量。
Redis 原生命令语法
Section titled “Redis 原生命令语法”ZRANGE key min max [BYSCORE|BYLEX] [REV] [WITHSCORES]参数说明
- key: 有序集合的键
- min: 范围起始位置(包含),从 0 开始计数
- max: 范围结束位置(包含),可以使用负数表示从末尾开始计数
- BYSCORE: 按分数查询
- BYLEX: 按字典序查询
- REV: 倒序排列
- WITHSCORES: 可选参数,同时返回成员的分数
ZRANGE 命令返回有序集合中指定范围内的成员,成员按照分数从低到高的顺序排列。下标参数 min 和 max 都以 0 为底,即 0 表示有序集合的第一个成员,1 表示第二个成员,以此类推。也可以使用负数下标,-1 表示最后一个成员,-2 表示倒数第二个成员,以此类推。
从 Redis 6.2.0 开始,ZRANGE 命令支持以下选项:
- BYSCORE: 按分数查询,此时 min 和 max 表示分数范围
- BYLEX: 按字典序查询,此时 min 和 max 表示字典序范围
- REV: 倒序排列,元素从最高分数到最低分数排序
- WITHSCORES: 同时返回成员的分数
- 如果没有指定 WITHSCORES 选项,返回指定范围内的成员列表
- 如果指定了 WITHSCORES 选项,返回成员和分数交替的列表
redis> ZADD myzset 1 "one" 2 "two" 3 "three"(integer) 3redis> ZRANGE myzset 0 -11) "one"2) "two"3) "three"redis> ZRANGE myzset 2 31) "three"redis> ZRANGE myzset -2 -11) "two"2) "three"redis> ZRANGE myzset 0 1 WITHSCORES1) "one"2) "1"3) "two"4) "2"redis> ZRANGE myzset 1 2 BYSCORE1) "two"2) "three"redis> ZRANGE myzset 0 1 REV1) "three"2) "two"Redisun 使用方式
Section titled “Redisun 使用方式”在 redisun 中,ZRANGE 命令通过 ZRangeCommand 类和 Redisun 类中的 zrange 方法实现。
Redisun redisun = Redisun.create(options -> { options.setHost("localhost"); options.setPort(6379);});
// 添加一些测试数据redisun.zadd("myzset", 1.0, "one");redisun.zadd("myzset", 2.0, "two");redisun.zadd("myzset", 3.0, "three");
// 获取所有成员List<String> members = redisun.zrange("myzset", 0, -1);
// 获取指定范围的成员List<String> rangeMembers = redisun.zrange("myzset", 0, 1);
// 获取指定范围的成员及其分数List<String> membersWithScores = redisun.zrange("myzset", 0, 1, cmd -> cmd.withScores());
// 按分数范围查询List<String> byScoreMembers = redisun.zrange("myzset", "1", "2", cmd -> cmd.byScore());
// 按字典序查询List<String> byLexMembers = redisun.zrange("myzset", "[a", "[z", cmd -> cmd.byLex());
// 倒序排列List<String> revMembers = redisun.zrange("myzset", 0, -1, cmd -> cmd.rev());
// 组合多个选项List<String> revWithScores = redisun.zrange("myzset", 0, -1, cmd -> cmd.rev().withScores());// 异步获取成员CompletableFuture<List<String>> future = redisun.asyncZrange("myzset", 0, -1);
// 处理异步结果future.thenAccept(members -> { System.out.println("Members: " + members);});
// 异步获取成员及其分数CompletableFuture<List<String>> futureWithScores = redisun.asyncZrange("myzset", 0, 1, cmd -> cmd.withScores());
// 处理异步结果futureWithScores.thenAccept(membersWithScores -> { System.out.println("Members with scores: " + membersWithScores);});
// 异步按分数范围查询CompletableFuture<List<String>> futureByScore = redisun.asyncZrange("myzset", "1", "2", cmd -> cmd.byScore());
// 处理异步结果futureByScore.thenAccept(members -> { System.out.println("Members by score: " + members);});- 范围参数超出有序集合范围时不会报错,会返回实际存在的成员
- 起始位置大于结束位置时会返回空列表
- 使用 WITHSCORES 选项时,返回结果中成员和分数交替出现