【问题标题】:Redis Lua memory consumptionRedis Lua 内存消耗
【发布时间】:2019-09-18 08:10:45
【问题描述】:

我在使用在 redis 上运行的 lua 脚本时遇到问题

当运行INFO 命令时

used_memory_lua_human:1.08G

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

如何降低这个值?

【问题讨论】:

    标签: redis lua


    【解决方案1】:

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

    鉴于脚本集有限,这是一个很好的功能。

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

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

    【讨论】:

    • 您可以(并且应该)使用KEYSARGV 来参数化您的脚本,而不是“格式化脚本”。
    • 使用 SCRIPT FLUSH 有风险吗?
    • 完全没有风险。
    • 别听这家伙的。这是非常危险的。你最好知道自己在做什么。
    【解决方案2】:

    gCoh 的回答很好地解释了为什么会发生这种情况。

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

    EVALSHA 将脚本缓存在 redis 服务器中,并在您第一次加载脚本时给出哈希值。当您第二次运行脚本时,它不会将脚本加载到服务器上,而是发送脚本哈希并由 redis 执行。

    现在,如果您运行 SCRIPT FLUSH,它将删除所有缓存的脚本,并且您的 SHA 哈希值将过时,这将导致在执行脚本时出现运行时错误并且找不到。

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

    这应该在 scripto 库中处理,如果找不到脚本,它应该再次加载它,但直到它们,请注意这不会发生在你身上。

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 2013-09-23
      • 2010-10-12
      • 1970-01-01
      • 2011-10-03
      • 2012-11-24
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多