使用Lua脚本向Redis进行多次HMSET操作

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"

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

2个回答

2
为了减少跳跃,您可以使用流水线技术 - 这样更简单并且具有所需的效果。
脚本也可以最小化跳跃。使用“KEYS”数组将哈希键名传递给脚本,并使用“ARGV”数组提供字段和值。

嗨@Itamar Haber,感谢您的回复。不幸的是,我正在使用的nekipelov/redisclient不支持流水线处理。 - georgeliatsos
所以使用脚本吧 ;) 你需要一个例子吗? - Itamar Haber
我的主要问题是如何在KEYS中传递哈希键和字段值到ARGV。迄今为止,我所有的尝试都填充了KEYS,但ARGV为空。你能给我推荐一个例子吗?谢谢! - georgeliatsos
我猜你是指一个带有 https://github.com/nekipelov/redisclient 的示例 - 抱歉,我不知道有没有... 你能展示一下你到目前为止尝试过的吗? - Itamar Haber
嗨@Itamar,感谢您的评论。通过您的回复以及在Youtube上观看了您关于Lua的视频,我发现我漏掉了KEYS和ARGV之间的逗号和空格(初学者的错误)。我会接受这个答案。谢谢! - georgeliatsos
啊,逗号和空格,常见的陷阱...但是你的问题表明你试图从C++代码中运行脚本,显然不是这种情况。无论如何,我很高兴它得到了解决! - Itamar Haber

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接