我在 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_id 中 num 的前缀。
现在,例如,如果我们将 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/