Redis词典范围搜索结果不一致

时间:2017-10-11 23:46:25

标签: search redis sortedset

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

  

工作查询

这是我使用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

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

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

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

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

问题查询

当我尝试选择使用较短版本的字符串时,我遇到了问题 - 当我希望它们返回 3 时,这些都会返回 0 结果。< / p>

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

然后再加回“m”使它再次返回所有三个元素。

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

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

为什么ZRANGEBYLEX myset [00000000022x [00000000022x\xff没有返回结果,但ZRANGEBYLEX myset [00000000022xm [00000000022xm\xff会返回所有结果 - 只是添加“m”似乎可以使其按预期工作?

2 个答案:

答案 0 :(得分:1)

如果您希望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)

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

答案 1 :(得分:0)

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

  

当排序集中的所有元素都插入相同的分数时,为了强制执行词典排序,此命令将返回键中有序集中的所有元素,其值介于最小值和最大值之间。

我的参赛作品没有相同的分数,所以他们没有按字典顺序排序。