5

由于性能原因,我需要尽量减少到 Redis 的跳数。我从 C++ 代码中多次调用 HMSET,我正在调查是否可以通过使用 Lua 脚本来更改它,并通过一次调用 Redis 来设置多个 Redis 哈希键:

HMSET myhash1 field1 "Hello" field2 "World"
HMSET myhash2 field1 "Hello" field2 "World"
HMSET myhash3 field1 "Hello" field2 "World"
...
HMSET myhashN field1 "Hello" field2 "World"

如何将多个哈希键和多个字段/值传递给脚本?


更新 基于 Itamar Haber 的评论,我发现我的问题是 KEYS 和 ARGV 值之间缺少空格的逗号 -

我最终得到了以下脚本:

local k = 1 
for i=1,  #KEYS do
    if redis.call('hmset', KEYS[i], ARGV[k], ARGV[k+1], ARGV[k+2], ARGV[k+3]) == 1 then
        return 1
    end 
    k = k + 4 
end                                                                                                                                                                                             
return 0

redis-cli --eval /var/tmp/script.lua myhash1 myhash2 , field1 "Hello" field2 "World" field1 "Hello" field2 "World"

我不确定它是否可以进一步优化以避免重复字段名称或为每个键传递任意数量的字段/值。

4

2 回答 2

2

为了最大限度地减少跃点,您可以改用流水线 - 更简单并且具有预期的效果。

脚本还可以最小化跃点。使用KEYS数组将哈希键名称传递给脚本,并使用ARGV数组提供字段和值。

于 2017-01-20T13:37:07.187 回答
1

在 Lua 的另一个问题中找到了答案,如何将表格用作可变参数(...)?.

所以我只是使用

redis.call('hmset', KEYS[i], table.unpack(ARGV) )

这对我有用。

于 2018-05-23T13:46:08.077 回答