Redis 字典序范围搜索结果不一致

Redis Lexicographical Range Search Inconsistent Results

我正在尝试对 Redis sorted set 进行字典范围搜索,但根据我对该功能工作原理的理解,得到的结果不一致。使用 ZRANGECOUNTZRANGEBYLEXZREMRANGEBYLEX.

时结果相似

Working Queries

这是我仅使用 ZRANGE.

的 3 个元素集的示例
redis> ZRANGE myset 0 -1 
0  00000000022xm26hax001
1  00000000022xm26hax002
2  00000000022xm26hax003

我还可以按字典顺序获取所有元素。

redis> ZRANGEBYLEX myset - +
0  00000000022xm26hax001
1  00000000022xm26hax002
2  00000000022xm26hax003

通过省略最后 3 个字符进行范围搜索也能按预期工作。

redis> ZRANGEBYLEX myset [00000000022xm26hax [00000000022xm26hax\xff
0  00000000022xm26hax001
1  00000000022xm26hax002
2  00000000022xm26hax003

调整范围参数我也可以select前两个元素。

redis> ZRANGEBYLEX myset [00000000022xm26hax001 [00000000022xm26hax002\xff
0  00000000022xm26hax001
1  00000000022xm26hax002

短的开始似乎是可以接受的:

redis> ZRANGEBYLEX myset [00000000022x [00000000022xm26hax001\xff
0  00000000022xm26hax001

Problem Queries

我 运行 遇到了问题,但是当我尝试 select 使用较短版本的字符串时 - 这些都是 return 0 结果当我希望他们 return 3.

ZRANGEBYLEX myset [00000000022xm26h [00000000022xm26h\xff
ZRANGEBYLEX myset [00000000022x [00000000022x\xff

但随后仅添加回 "m" 就可以再次 return 所有三个元素。

redis> ZRANGEBYLEX myset [00000000022xm [00000000022xm\xff
0  00000000022xm26hax001
1  00000000022xm26hax002
2  00000000022xm26hax003

有人可以解释这种行为吗?给定我的示例数据集,取回以 "00000000022x" 开头的所有元素的正确方法是什么?

为什么 ZRANGEBYLEX myset [00000000022x [00000000022x\xff return 没有结果,但 ZRANGEBYLEX myset [00000000022xm [00000000022xm\xff return 是所有结果 - 只需添加 "m" 似乎就可以按预期工作?

如果您希望 Redis 解析字符串中的转义码(例如示例中的 \xff),您需要将字符串用引号引起来。

换句话说,这会将 \xff 视为字节 255:

127.0.0.1:6379> ZRANGEBYLEX myset [00000000022xm26hax001 "[00000000022xm26ha\xff"
1) "00000000022xm26hax001"
2) "00000000022xm26hax002"
3) "00000000022xm26hax003"

而这将 \xff 视为四个字节(92、120、102、102):

127.0.0.1:6379> ZRANGEBYLEX myset [00000000022xm26hax001 [00000000022xm26ha\xff
(empty list or set)

这解释了您令人困惑的结果。

这个问题的解决方案最终不能由我发布的问题来确定。为清楚起见,我省略了每个排序集条目的分数,这本来是一个过期时间戳。不幸的是 ZRANGEBYLEX 的文档说:

When all the elements in a sorted set are inserted with the same score, in order to force lexicographical ordering, this command returns all the elements in the sorted set at key with a value between min and max.

我的条目没有相同的分数,所以它们没有按字典顺序排序。