【发布时间】:2015-10-28 02:51:32
【问题描述】:
我正在为 lua 中的 redis 编写一些逻辑,几乎我的每个脚本都有一些共同点,将其移出到共享函数会非常方便,但是
- redis 不能使用 lua 的 require 语句
- 官方不能调用其他redis函数(见:https://stackoverflow.com/a/22599862/1812225)
例如,我到处都有这个 sn-p
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 命令时不能轻易移动到客户端,并且作为事务的一部分工作
谢谢!
【问题讨论】:
-
假设有可能让这个常见的 sn-p “共享” - 你真的想使用它吗?换句话说,这是一项需要多次完成的平凡任务……将其推送到 Lua 脚本中意味着您将使用 Redis 数据库中的资源来执行可以在其他地方完成的事情。我并不是说这是错误的,但根据经验,我尽量将这种类型的逻辑保留在数据库之外。
-
关于这个 sn-p 你可能是对的@itamar-haber。但是我有另一种情况,当我需要用条件逻辑做事时,一遍又一遍地触发redis命令......它不能轻易移动到客户端
-
另一方面,我可能应该创建另一个具有重复步骤的脚本,并在
MULTI中使用它们,即MULTI EVALSHA EVALSHA ...从带宽的角度来看,这似乎并不理想,但不应该成为一个大问题 -
每种情况都不同 :) 基本上选项是 a) 复制粘贴 b) 使用未记录的 f_
方法或 c) 围绕 Redis 的全局保护“破解”。我觉得最安全的是(a) -
@ItamarHaber 两件事。 a) 什么是未记录的 f_
方法? b) 为什么在这里使用 redis-lua-debugger 使用的技巧? (github.com/RedisLabs/redis-lua-debugger)(当然要考虑到slave不能自己运行脚本的限制)。