Redis OSS Lua 脚本 - 亚马逊 ElastiCache (Redis OSS)
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Redis OSS Lua 脚本

Redis OSS 支持 200 多个命令,包括用于运行 Lua 脚本的命令。但是,在 Lua 脚本方面,有几个陷阱可能会影响 Redis OSS 的内存和可用性。

非参数化 Lua 脚本

每个 Lua 脚本在运行之前都会缓存到 Redis OSS 服务器上。未参数化的 Lua 脚本是独一无二的,这可能会导致 Redis OSS 服务器存储大量 Lua 脚本并消耗更多内存。为了减轻此情况,请确保所有 Lua 脚本都已参数化,并在需要时定期执行 SCRIPT FLUSH 来清除缓存的 Lua 脚本。

以下示例说明如何定义和使用参数化脚本。首先,我们提供了一个非参数化方法的示例,它会生成三个不同的缓存 Lua 脚本,建议不使用此方法:

eval "return redis.call('set','key1','1')" 0 eval "return redis.call('set','key2','2')" 0 eval "return redis.call('set','key3','3')" 0

相反,请使用以下模式来创建能够接受传递的参数的单个脚本:

eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key1 1 eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key2 2 eval "return redis.call('set',KEYS[1],ARGV[1])" 1 key3 3

长时间运行的 Lua 脚本

Lua 脚本可以以原子方式运行多个命令,因此完成时间可能比普通的 Redis OSS 命令更长。如果 Lua 脚本仅运行只读操作,则可中途将其停止。不过,一旦 Lua 脚本执行写入操作,就无法将其终止,必须运行直至完成。长时间运行的 Lua 脚本正在发生变化,可能会导致 Redis OSS 服务器长时间无响应。要缓解此问题,请避免长时间运行的 Lua 脚本,并在预生产环境中测试脚本。

带 Stealth 写入的 Lua 脚本

即使 Redis OSS 已经结束,Lua 脚本也可以通过以下几种方式继续向 Redis OSS 写入新数据:maxmemory

  • 该脚本在 Redis OSS 服务器位于下方时启动maxmemory,并且里面包含多个写入操作

  • 脚本的第一条写入命令不占用内存(例如 DEL),后跟的多个写入操作会占用内存

  • 您可以通过在除之外的 Redis OSS 服务器中配置适当的驱逐策略来缓解此问题。noeviction这允许 Redis OSS 在 Lua 脚本之间驱逐物品并释放内存。