与REDIS匹配的最长前缀具有超过500万个键值对

时间:2014-01-13 13:00:40

标签: c linux redis

我在REDIS服务器中存储了超过500万个键值对。我们需要在REDIS服务器中搜索的传入密钥将类似于“ key_num_id ”格式。

键和值存储在REDIS服务器中,如“ key_pfx_id ”格式。所有键都是唯一键(没有两个键是相同的)。以下是几个例子:

key_1234_11
key_123_12
key_123_11
key_12_11
..
..

其中1234,123,12是传入密钥 key_num_id num 的前缀。

现在,例如,如果我们将 key_1234567890_11 作为传入密钥,那么REDIS应该提供与“key_1234_11”相对应的,这是最好的匹配“num”,我们在示例中输入了密钥“1234567890”

这样做的一种方法是多次查询REDIS服务器,直到得到值; e.g。

GET key_1234567890_11
GET key_123456789_11
GET key_12345678_11
GET key_1234567_11
.
.

但我认为这是一个代价高昂的解决方案,因为我在一秒钟内收到大约2000个传入密钥。所以想要有优化的解决方案。任何人都可以帮忙,因为我是REDIS的新手

注意:我在C代码

中执行上述所有操作

1 个答案:

答案 0 :(得分:0)

在Redis的单次调用中,您可以通过一种方式将迭代逻辑放在Lua脚本中。

local input = KEYS[1]
local key, output
while string.len(input) > 1 do
  key = "test_" .. input .. "_11"
  output = redis.call("GET", key)
  if output then return output end
  input = string.sub(input, 1, string.len(input) - 1)
end
return nil

调用(redis.eval(script_body, ["12345678"]))时,它应该正确返回key_1234_11的值。显然,这是一个简单的例子,需要根据您的应用进一步定制。

这节省了多次调用redis的开销,但是,我想与C相比,那么Lua本身可能有点开销。在这种情况下,我无法确定Lua脚本是否更快,但它可能是。