目前我制作了一些加载到Redis的LUA脚本来执行一些命令。有些函数对于所有脚本都是通用的,比如解析东西或数据转换,我一直在脚本之间进行复制/粘贴,而不是简单地重用它们。无法创建“require”,因为Redis无法知道加载文件的位置。
对于我添加的每个脚本,维护噩梦变得更大!
如何将 DRY 主体应用于此案例? 我想到的唯一方法是 T4代码生成器。
我可以用这段代码制作一个“lua”文件:
K
T4将尝试读取扩展名为.lua的每个文件并查找 #import 标记。对于每个 #import 标记,都会找到相应的文件,并用实际代码替换该行。这样T4将自动进行复制/粘贴。
“DataTransformer”中的代码应该分配给名为“DataTransformer”的对象,导入DataTransformer的代码可以使用对象DataTransformer。{function}来使用它。
这是否有意义或是否有更简单的方法来实现这一目标?
答案 0 :(得分:2)
tl; dr否 - 没有这样的方法,使用T4或任何其他预处理器进行查找和替换是最好的方法。
详细信息:至少有两种未记录的方法可以做你想要的事情(一个在for_stack的答案中,另一个在全局metatable中),但你真的不应该使用它们。未记录意味着它们可能在以后的版本中不起作用......
脚本应该是独立的。在运行脚本依赖项之前,您真的不想开始担心。只要您使用缓存脚本(使用SCRIPT LOAD
和EVALSH
),除了维护所有副本之外,没有真正的开销来复制相同的有效负载。最好的方法是使用可重复使用的元素"注入"从模板到部署前的脚本jut。这样你也可以独立地对可重复使用的单元进行单元测试。
答案 1 :(得分:0)
您可以使用SCRIPT LOAD
命令将这些功能脚本加载到缓存中,并以f_sha-code
的形式在其他lua脚本中调用它们。
将功能脚本加载到缓存
./redis-cli script load "redis.call('SET', KEYS[1], ARGV[1])"
Redis返回此脚本的SHA代码:xxxx-SHA-CODE-xxxx
调用该函数,即其他lua脚本中的f_xxxx-SHA-CODE-xxxx
。
./redis-cli eval "f_xxxx-SHA-CODE-xxxx(KEYS[1], ARGV[1]); return redis.call('GET', KEYS[1])" 1 key val