这就是我想要做的;我有一堆数字块(整数)不一定是连续的,在表单中有一些相关的数据:
<from>-<to> -> <data>
。即:
0-9 -> "some_data_a"
10-15 -> "some_data_b"
20-25 -> "some_data_c"
所以现在我得到,让我们说,22号,所以我不得不以某种方式从redis中检索 &#34; some_data_c&#34 ;.我正在考虑使用像:
这样的键blocks:0:9
blocks:10:15
blocks:20:25
但我还没有找到像以下那样进行键范围搜索的方法:
redis-cli> keys block:[from <= 22]:[22 <= to]
blocks:20:25
我需要尽可能地做到这一点。任何想法?
答案 0 :(得分:1)
假设范围是互斥的,只需保留一个排序集,每个成员的分数都是该范围的上限。根据您的示例中的数据,这基本上会导致:
ZADD upper 5 "data:0-5" 15 "data:10-15” 25 "data:20-25"
对下限做同样的事情:
ZADD lower 0 "data:0-5" 10 "data:10-15” 20 " data:20-25"
最后,您需要创建与集合成员对应的密钥 - 这些密钥将保存实际数据:
SET data:0-5 "some_data_a"
SET data:10-15 "some_data_b"
SET data:20-25 "some_data_c"
现在,要获得结果,请执行以下操作:
ZRANGEBYSCORE upper 22 +inf LIMIT 0 1
ZREVRANGEBYSCORE lower -inf 22 LIMIT 0 1
(假设您正在寻找22的数据)
如果您要查找的数字存在于范围块中,则两个Z * RANGE命令都应返回相同的数据。不在该范围内的值将导致其中一个Z * RANGE返回nil。一旦你有两个非零结果,获得由集合成员命名的密钥(即GET数据:20-25)。