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

标签 c linux redis

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

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

key_1234_11
key_123_12
key_123_11
key_12_11
..
..

其中 1234、123、12 是传入 key key_num_idnum 的前缀。

现在,例如,如果我们将 key_1234567890_11 作为传入键,那么 REDIS 应该给出与 "key_1234_11" 对应的 value,这是最好的在我们的示例中,匹配我们在传入 key “1234567890” 中获得的 “num”

一种方法是多次查询 REDIS 服务器,直到我们得到值;例如

GET key_1234567890_11
GET key_123456789_11
GET key_12345678_11
GET key_1234567_11
.
.

但我认为这是一个代价高昂的解决方案,因为我在一秒钟内获得了大约 2000 个传入 key 。所以想有优化的解决方案。我是 REDIS 的新手,有人可以帮忙吗

注意:以上所有操作都是用 C 代码完成的

最佳答案

您可以在对 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 脚本在这种情况下是否更快,但它可能是。

关于c - 与具有超过 500 万个键值对的 REDIS 匹配的最长前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21091968/

相关文章:

c++ - int 和 float 之间的东西比 float 保留更少的内存?

c - Xcode 中的 strlen EXC_BAD_ACCESS - c

Python virtualenv 问题

memory - redis内存增长infi

java - 只有一台主机的 Redis 哨兵

c - 什么是 "near-initialization"?

c - 你将如何有效地实现tail?

linux - 如何在性能测试期间监控 cpu 使用率和网络使用率

linux - 如何将 `config.sh` 中的变量包含到 `a.sh` 和 `b.sh` 中?

events - 有没有办法使用像redis这样的持久性数据库来延迟特定时间?