使用redis在一个键块内搜索一个键

时间:2014-06-11 19:37:49

标签: redis

这就是我想要做的;我有一堆数字块(整数)不一定是连续的,在表单中有一些相关的数据:

<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

我需要尽可能地做到这一点。任何想法?

1 个答案:

答案 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)。