Redis Lua内存消耗

我在使用运行在 Redis 上的 Lua 脚本时遇到了问题

当运行 INFO 命令时

used_memory_lua_human:1.08G

Lua 的使用不是很广泛(单个 set 和 get 命令)

如何减少这个值?

点赞
用户1668328
用户1668328

显然,Redis会缓存正在运行的每个Lua脚本,以节省加载时间。

这是一个好的特性,前提是脚本的集合是有限的。

问题是,因为我们在每次执行时都使用不同的变量格式化脚本,所以每次执行时它都会获得一个不同的标识符。

我找到的解决方案是在每次执行后运行SCRIPT FLUSH命令,以将脚本从缓存中删除。

2019-09-18 09:14:19
用户6446771
用户6446771

关于为什么会出现这种情况的解释可以在gCoh的回答中得到很好的解释。

唯一的问题是,如果使用EVALSHA来运行LUA脚本,则运行SCRIPT FLUSH可能会导致许多错误甚至处理的丢失。(例如,像scripto这样的库使用EVALSHA运行LUA脚本)。在此阅读更多关于EVALSHA的信息此处

EVALSHA将脚本缓存在redis服务器中,并在第一次加载脚本时提供一个哈希。第二次运行脚本时,它不会在服务器上加载脚本,而只是发送脚本哈希并由redis执行。

现在,如果您运行SCRIPT FLUSH,它将删除所有缓存的脚本,您的SHA哈希将变得过时,这将导致在执行脚本时发生运行时错误而无法找到脚本。

对我来说,它是这样的:NOSCRIPT No matching script. Please use EVAL.

在scripto库中应该处理这个问题,如果找不到脚本,它应该重新加载,但在此之前,请注意不要让这种情况发生。

2020-08-19 05:44:45