gpt4 book ai didi

lua - Redis如何减少lua复制粘贴

转载 作者:IT王子 更新时间:2023-10-29 06:04:32 25 4
gpt4 key购买 nike

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

  1. redis不能使用lua的require语句
  2. 正式你不能调用其他 redis 函数(参见:https://stackoverflow.com/a/22599862/1812225)

例如,我到处都有这个片段

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

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

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

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

“黑客”#2

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

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

附言

这两个 hack 都需要额外的管理工作来确保这些“全局”脚本在任何其他脚本调用它们之前实际加载。

关于lua - Redis如何减少lua复制粘贴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31830644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com