Redis如何减少lua复制粘贴

时间:2015-08-05 11:01:46

标签: lua redis

我正在为lua中的redis编写一些逻辑,几乎我的每个脚本都有一些共同点,将它移到共享函数中会非常方便,但是

  1. redis不能使用lua的require语句
  2. 官方你不能调用其他redis功能(参见:https://stackoverflow.com/a/22599862/1812225
  3. 例如,我在任何地方都有这个片段

    local prefix = "/" .. type
    if typeId then
        prefix = prefix .. "(" .. typeId .. ")"
    end
    

    我正在考虑在将脚本提供给redis之前进行一些后期处理,但这似乎是一种过度杀戮......

    解决/减少此问题的最佳做法是什么?

    更新:

    local registryKey = "/counters/set-" .. type
    local updatedKey = "/counters/updated/set-" .. type
    if typeId then
        redis.call("SAdd", updatedKey, name .. ":" .. typeId)
        redis.call("SAdd", registryKey, name .. ":" .. typeId)
    else
        redis.call("SAdd", updatedKey, name)
        redis.call("SAdd", registryKey, name)
    end
    

    是另一个代码示例,它不能轻易地移动到客户端,因为它调用redis命令,并作为事务的一部分

    谢谢!

1 个答案:

答案 0 :(得分:3)

<强>&#34;哈克&#34; #1

在你SCRIPT LOAD之后,你会得到一个可以与EVALSHA一起使用的sha1哈希。可以使用相同的sha1值从 inside 另一个脚本中调用该脚本 - 只需调用函数f_<sha1>即可。也就是说,使用这种方式传递KEYS / ARGV结构的方式存在一些差异。

请注意,这是未记录的行为,这意味着在将来的Redis版本中行为可能会发生变化。

教导我的这一点归功于Josiah Carlson博士,而Josiah Carlson博士又为其他人(IIRC Fritzy)提供了信誉。有关更多信息,请查看他的lua-call Python包装器:https://github.com/josiahcarlson/lua-call

<强>&#34;哈克&#34; #2

Redis沙箱Lua并对其施加了一些限制以保持理智。你可以绕过其中一些,例如访问_G并在那里定义您的实用程序功能,以便所有脚本都可以使用它(就像我使用https://github.com/redislabs/redis-lua-debugger所做的那样)。

然而,这也是非常危险的 - 除了潜在的复制问题,这种用法未经测试,因此可能导致未定义的行为(我设法用我的小脚本崩溃了很多实例;)。)。

<强> P.S。

两个黑客都需要额外的管理工作来确保这些&#34;全球&#34;脚本实际上是在任何其他脚本调用它们之前加载的。