【问题标题】:Multiple HMSET to Redis with Lua script使用 Lua 脚本的多个 HMSET 到 Redis
【发布时间】:2017-06-05 07:10:30
【问题描述】:

由于性能原因,我需要尽量减少到 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"

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

【问题讨论】:

    标签: lua redis redisclient


    【解决方案1】:

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

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

    【讨论】:

    • 嗨@Itamar Haber,感谢您的回复。不幸的是,我使用的 nekipelov/redisclient 不支持流水线。
    • 所以使用脚本 ;) 你需要一个例子吗?
    • 我的主要问题是如何将 KEYS 中的哈希键和字段值传递给 ARGV。到目前为止,我所有的尝试都在填充 KEYS,但 ARGV 是空的。你能给我举个例子吗?谢谢!
    • 我假设您的意思是带有 github.com/nekipelov/redisclient 的示例 - 抱歉,我不知道...您能展示一下到目前为止您尝试过的内容吗?
    • 嗨@Itamar,感谢您的评论。您的回复以及在 Youtube 上查看您的 Lua 视频,我发现我在 KEYS 和 ARGV 之间缺少逗号和空格(初学者的错误)。我会接受答案。谢谢!
    【解决方案2】:

    我在另一个问题in Lua, how can I use a table as varargs (...)? 中找到了答案。

    所以我只是使用

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

    这对我有用。

    【讨论】:

      猜你喜欢
      • 2020-03-18
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 2014-04-15
      • 2015-12-18
      • 1970-01-01
      相关资源
      最近更新 更多