首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与具有500多万个密钥值对的REDIS最长的前缀匹配

与具有500多万个密钥值对的REDIS最长的前缀匹配
EN

Stack Overflow用户
提问于 2014-01-13 13:00:40
回答 1查看 903关注 0票数 1

我在REDIS服务器上存储了500多万对密钥。我们需要在REDIS服务器中搜索的传入密钥将类似于"key_num_id“格式。

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

代码语言:javascript
复制
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"的值,这是我们在传入密钥"1234567890"中获得的"num"的最佳匹配。

一种方法是对REDIS服务器进行多次查询,直到得到值为止。

代码语言:javascript
复制
GET key_1234567890_11
GET key_123456789_11
GET key_12345678_11
GET key_1234567_11
.
.

但是我认为这是一个代价很高的解决方案,因为我一秒钟就能得到大约2000个输入的密钥。所以想要有优化的解决方案。有人能帮上忙吗,因为我是红系的新手

注意:我正在用C代码做以上所有的工作

EN

回答 1

Stack Overflow用户

发布于 2014-01-14 08:00:01

一种可以在对Redis的单个调用中做到这一点的方法是将迭代逻辑放在Lua脚本中。

代码语言:javascript
复制
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脚本更快,但它可能更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21091968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档