本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Lua 脚本
Valkey 和 Redis OSS 支持 200 多个命令,包括运行 Lua 脚本的命令。但是,在 Lua 脚本方面,有几个陷阱可能会影响 Valkey 或 Redis 的内存和可用性。OSS
非参数化 Lua 脚本
每个 Lua 脚本在运行之前都会缓存在 Valkey 或 Redis OSS 服务器上。未参数化的 Lua 脚本是独一无二的,这可能会导致 Valkey 或 Redis OSS 服务器存储大量 Lua 脚本并消耗更多内存。为了缓解这种情况,请确保所有 Lua 脚本都已参数化,并在需要时定期执行SCRIPTFLUSH以清理缓存的 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 脚本可以以原子方式运行多个命令,因此完成时间可能比普通的 Valkey 或 Redis 命令更长。OSS如果 Lua 脚本仅运行只读操作,则可中途将其停止。不过,一旦 Lua 脚本执行写入操作,就无法将其终止,必须运行直至完成。长时间运行的 Lua 脚本正在发生变异,可能会导致 Valkey 或 Redis OSS 服务器长时间无响应。要缓解此问题,请避免长时间运行的 Lua 脚本,并在预生产环境中测试脚本。
带 Stealth 写入的 Lua 脚本
OSS即使 Valkey 或 Redis 结束了,Lua 脚本也可以通过以下几种方式继续向 Valkey 或 Redis 写入新数据:OSSmaxmemory
该脚本在 Valkey 或 Redis OSS 服务器位于下方时启动
maxmemory
,并在其中包含多个写入操作脚本的第一个写入命令不消耗内存(例如DEL),然后是更多消耗内存的写入操作
您可以通过在 Valkey 或 Redis OSS 服务器中配置适当的驱逐策略来缓解此问题。
noeviction
这允许 Redis OSS 在 Lua 脚本之间驱逐物品并释放内存。