【发布时间】:2019-09-18 08:10:45
【问题描述】:
我在使用在 redis 上运行的 lua 脚本时遇到问题
当运行INFO 命令时
used_memory_lua_human:1.08G
Lua 的使用并不广泛(单个 set 和 get 命令)
如何降低这个值?
【问题讨论】:
我在使用在 redis 上运行的 lua 脚本时遇到问题
当运行INFO 命令时
used_memory_lua_human:1.08G
Lua 的使用并不广泛(单个 set 和 get 命令)
如何降低这个值?
【问题讨论】:
显然,Redis 会缓存在其上运行的每个 Lua 脚本,以便节省加载时间。
鉴于脚本集有限,这是一个很好的功能。
问题是因为我们在每次执行时都使用不同的变量格式化脚本,并且每次执行都会获得不同的标识符。
我找到的解决方案是在每次执行后运行SCRIPT FLUSH 命令,以便将其从缓存中删除
【讨论】:
KEYS 和ARGV 来参数化您的脚本,而不是“格式化脚本”。
gCoh 的回答很好地解释了为什么会发生这种情况。
唯一的问题是如果使用EVALSHA 运行LUA 脚本,运行SCRIPT FLUSH 会导致很多错误甚至丢失处理。 (例如,像scripto 这样的库使用EVALSHA 运行LUA 脚本)。阅读更多关于 EVALSHA here
EVALSHA 将脚本缓存在 redis 服务器中,并在您第一次加载脚本时给出哈希值。当您第二次运行脚本时,它不会将脚本加载到服务器上,而是发送脚本哈希并由 redis 执行。
现在,如果您运行 SCRIPT FLUSH,它将删除所有缓存的脚本,并且您的 SHA 哈希值将过时,这将导致在执行脚本时出现运行时错误并且找不到。
对我来说是这样的:NOSCRIPT No matching script. Please use EVAL.
这应该在 scripto 库中处理,如果找不到脚本,它应该再次加载它,但直到它们,请注意这不会发生在你身上。
【讨论】: