使用 Lua 脚本将多个 HMSET 传输到 Redis

geo*_*sos 5 lua redis redisclient

出于性能考虑,我需要尽量减少到 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"
Run Code Online (Sandbox Code Playgroud)

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


更新 根据 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"
Run Code Online (Sandbox Code Playgroud)

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

Ita*_*ber 2

为了最大限度地减少跃点,您可以使用管道技术 - 更简单并且具有所需的效果。

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