我正在为lua中的redis编写一些逻辑,几乎我的每个脚本都有一些共同点,将它移到共享函数中会非常方便,但是
例如,我在任何地方都有这个片段
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命令,并作为事务的一部分
谢谢!
答案 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;脚本实际上是在任何其他脚本调用它们之前加载的。