如何重用将加载到Redis的LUA脚本上的代码?

时间:2017-04-13 21:09:02

标签: c# lua redis dry t4

目前我制作了一些加载到Redis的LUA脚本来执行一些命令。有些函数对于所有脚本都是通用的,比如解析东西或数据转换,我一直在脚本之间进行复制/粘贴,而不是简单地重用它们。无法创建“require”,因为Redis无法知道加载文件的位置。

对于我添加的每个脚本,维护噩梦变得更大!

如何将 DRY 主体应用于此案例? 我想到的唯一方法是 T4代码生成器

我可以用这段代码制作一个“lua”文件:

K

T4将尝试读取扩展名为.lua的每个文件并查找 #import 标记。对于每个 #import 标记,都会找到相应的文件,并用实际代码替换该行。这样T4将自动进行复制/粘贴。

“DataTransformer”中的代码应该分配给名为“DataTransformer”的对象,导入DataTransformer的代码可以使用对象DataTransformer。{function}来使用它。

这是否有意义或是否有更简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

tl; dr否 - 没有这样的方法,使用T4或任何其他预处理器进行查找和替换是最好的方法。

详细信息:至少有两种未记录的方法可以做你想要的事情(一个在for_stack的答案中,另一个在全局metatable中),但你真的不应该使用它们。未记录意味着它们可能在以后的版本中不起作用......

脚本应该是独立的。在运行脚本依赖项之前,您真的不想开始担心。只要您使用缓存脚本(使用SCRIPT LOADEVALSH),除了维护所有副本之外,没有真正的开销来复制相同的有效负载。最好的方法是使用可重复使用的元素"注入"从模板到部署前的脚本jut。这样你也可以独立地对可重复使用的单元进行单元测试。

答案 1 :(得分:0)

您可以使用SCRIPT LOAD命令将这些功能脚本加载到缓存中,并以f_sha-code的形式在其他lua脚本中调用它们。

  1. 将功能脚本加载到缓存

    ./redis-cli script load "redis.call('SET', KEYS[1], ARGV[1])"

    Redis返回此脚本的SHA代码:xxxx-SHA-CODE-xxxx

  2. 调用该函数,即其他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