Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用redis搜索一组密钥中的密钥_Redis - Fatal编程技术网

使用redis搜索一组密钥中的密钥

使用redis搜索一组密钥中的密钥,redis,Redis,这就是我想做的;我有一堆不一定是连续的数字块(整数),它们有以下形式的相关数据: <from>-<to> -> <data> 所以现在我得到了,比方说,22号,所以我必须以某种方式从redis检索 “一些数据”。我在考虑有这样的钥匙: blocks:0:9 blocks:10:15 blocks:20:25 但我还没有找到进行键范围搜索的方法,例如: redis-cli> keys block:[from <= 22]:[22 <

这就是我想做的;我有一堆不一定是连续的数字块(整数),它们有以下形式的相关数据:

<from>-<to> -> <data> 
所以现在我得到了,比方说,22号,所以我必须以某种方式从redis检索 “一些数据”。我在考虑有这样的钥匙:

blocks:0:9
blocks:10:15
blocks:20:25
但我还没有找到进行键范围搜索的方法,例如:

redis-cli> keys block:[from <= 22]:[22 <= to]
blocks:20:25

redis cli>keys block:[from假设范围相互排斥,只需保留一个排序集,每个成员的分数为范围的上限。按照示例中的数据,这基本上会导致:

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*范围返回nil。一旦两个非nil结果都存在,则获取由集合成员命名的键(即获取数据:20-25).

谢谢你的回答。这看起来不错,但有一个问题。使用我提供的示例,如果你查找17,它将返回“some_data_c”,而实际上它不在任何块中,因此应返回nil。非常正确-修复了我的答案以处理该问题:)另一个编辑:因为可能是“some_data”对于几个范围块也是一样的,因为集合由唯一的成员组成,所以我改变了答案,使集合引用实际的键名,而这些键名又保存着数据。唯一让我感到不舒服的是,上下集合基本上在其成员中保存着相同的数据,所以有点多余。最后,让如果性能尽可能好,我建议将逻辑封装在Lua脚本中。
ZRANGEBYSCORE upper 22 +inf LIMIT 0 1
ZREVRANGEBYSCORE lower -inf 22 LIMIT 0 1