ZRANGEBYLEX (已弃用)
从 Redis 6.2.0 版本开始,此命令被视为已弃用。
它可以在迁移或编写新代码时被 ZRANGE
替换,使用 BYLEX
参数。
ZRANGEBYLEX key min max [LIMIT offset count]
- 可用版本
- Redis 开源版 2.8.9
- 时间复杂度
- O(log(N)+M),其中 N 是有序集合中的元素数量,M 是返回的元素数量。如果 M 是常数(例如始终使用 LIMIT 请求前 10 个元素),则可以认为是 O(log(N))。
- ACL 类别
-
@read
,@sortedset
,@slow
,
当有序集合中的所有元素都以相同的分数插入时,为了强制执行字典序排序,此命令返回有序集合中键为 key
且值介于 min
和 max
之间的所有元素。如果有序集合中的元素分数不同,返回的元素是未指定的。
如果有序集合中的元素分数不同,返回的元素是未指定的。
元素被认为是按照字符串从小到大排序的,使用 C 函数 memcmp()
逐字节比较。如果公共部分相同,较长的字符串被认为大于较短的字符串。
可选的 LIMIT
参数可用于只获取匹配元素的一个范围(类似于 SQL 中的 *SELECT LIMIT offset, count*)。负数 count
从 offset
返回所有元素。请注意,如果 offset
很大,需要在返回元素之前遍历 offset
个有序集合中的元素,这可能会导致 O(N) 的时间复杂度。
如何指定区间
有效的 *start* 和 *stop* 必须以 (
或 [
开头,分别表示范围项是排他性或包含性的。*start* 和 *stop* 的特殊值 +
或 -
分别表示正无穷和负无穷字符串,因此例如命令 ZRANGEBYLEX myzset - + 保证返回有序集合中的所有元素,前提是所有元素都具有相同的分数。
字符串比较详情
字符串被视为字节的二进制数组进行比较。由于 ASCII 字符集的指定方式,这意味着通常也会以明显的字典方式比较普通 ASCII 字符。但是,如果使用非纯 ASCII 字符串(例如 utf8 字符串),则情况并非如此。
但是,用户可以对编码后的字符串应用转换,以便插入有序集合中的元素的第一部分按照用户的特定应用程序要求进行比较。例如,如果我想添加以不区分大小写方式进行比较的字符串,但在查询时仍希望检索实际大小写,我可以按以下方式添加字符串
ZADD autocomplete 0 foo:Foo 0 bar:BAR 0 zap:zap
由于每个元素(在冒号字符之前)都有第一个 *规范化* 部分,我们强制执行特定的比较,但是在使用 ZRANGEBYLEX
查询范围后,应用程序可以将字符串的第二部分(冒号之后的部分)显示给用户。
比较的二进制性质允许将有序集合用作通用索引,例如元素的第一个部分可以是 64 位大端序数字:由于大端序数字将最高有效字节放在起始位置,二进制比较将与数字的数值比较相匹配。这可以用于实现对 64 位值的范围查询。如下例所示,在前 8 个字节之后,我们可以存储我们实际索引的元素的值。