我正在尝试在Redis sorted set上进行字典范围搜索,但根据我对此功能的工作原理的理解,会得到不一致的结果。使用ZRANGECOUNT
,ZRANGEBYLEX
和ZREMRANGEBYLEX
时,结果相似。
工作查询
这是我使用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”似乎可以使其按预期工作?
答案 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
的文档说:
当排序集中的所有元素都插入相同的分数时,为了强制执行词典排序,此命令将返回键中有序集中的所有元素,其值介于最小值和最大值之间。
我的参赛作品没有相同的分数,所以他们没有按字典顺序排序。