使用 Lua 脚本的多个 HMSET 到 Redis
Multiple HMSET to Redis with Lua script
由于性能原因,我需要尽量减少到 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"
如何向脚本传递多个散列键和多个 fields/values?
更新
根据 Itamar Haber 的评论,我发现我的问题是 KEYS 和 ARGV 值之间缺少 space 的逗号 -
我最终得到了以下脚本:
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"
我不确定是否可以进一步优化它以避免重复字段名称或为每个键传递任意数量的 fields/values。
要最大程度地减少跃点,您可以改用流水线 - 更简单并且具有预期的效果。
脚本也可以最小化跳数。使用 KEYS
数组将哈希键名称传递给脚本,并使用 ARGV
数组提供字段和值。
我在另一个问题中找到了答案 in Lua, how can I use a table as varargs (...)? .
所以我只用
redis.call('hmset', KEYS[i], table.unpack(ARGV) )
这对我有用。
由于性能原因,我需要尽量减少到 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"
如何向脚本传递多个散列键和多个 fields/values?
更新 根据 Itamar Haber 的评论,我发现我的问题是 KEYS 和 ARGV 值之间缺少 space 的逗号 -
我最终得到了以下脚本:
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"
我不确定是否可以进一步优化它以避免重复字段名称或为每个键传递任意数量的 fields/values。
要最大程度地减少跃点,您可以改用流水线 - 更简单并且具有预期的效果。
脚本也可以最小化跳数。使用 KEYS
数组将哈希键名称传递给脚本,并使用 ARGV
数组提供字段和值。
我在另一个问题中找到了答案 in Lua, how can I use a table as varargs (...)? .
所以我只用
redis.call('hmset', KEYS[i], table.unpack(ARGV) )
这对我有用。