使用 Lua 脚本将多个 HMSET 写入 Redis

出于性能考虑,我需要尽量减少到 Redis 的跳数。我正在从 C++ 代码中多次调用 HMSET,并且正在研究是否可以使用 Lua 脚本来改变此问题并向 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"

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

点赞
用户3160475
用户3160475

为了最小化跳跃,你可以使用管道而非多个请求 - 更简单,且具有所需效果。

脚本也可以最小化跳跃。使用 KEYS 数组将哈希键名称传递到脚本中,使用 ARGV 数组提供字段和值。

2017-01-20 13:37:07
用户254477
用户254477

我在另一个问题中找到了答案 如何在 Lua 中将表用作 varargs(...)?

因此,我只需要使用

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

这对我有用。

2018-05-23 13:46:08