【问题标题】:Redis out of memory, even with allkeys-lru policyRedis 内存不足,即使使用 allkeys-lru 策略
【发布时间】:2014-07-28 07:39:28
【问题描述】:

我有一个带有 maxmemory 512MBmaxmemory-policy allkeys-lru 的 Redis 服务器,但是在使用一天后服务器已满,我无法再添加任何项目:

redis 127.0.0.1:6379[3]> set foooo 123
(error) OOM command not allowed when used memory > 'maxmemory'.

恕我直言,LRU 政策绝不应该发生这种情况。

我将一些服务器信息复制到此 Pasebin:http://pastebin.com/qkax4C7A

我该如何解决这个问题?

注意:我正在尝试使用 maxmemory,因为我的 Redis 服务器一直在消耗内存,尽管几乎所有键都有过期设置,并且因为 @987654326 @ 不会释放系统内存 - 也许这是相关的..

最后我尝试使用 Redis 作为缓存。

【问题讨论】:

    标签: redis


    【解决方案1】:

    您的info 输出表明您的服务器的大量内存被 Lua 脚本占用:

    used_memory_lua:625938432
    

    请注意,Lua 脚本会一直保留在内存中,直到服务器重新启动或调用 SCRIPT FLUSH。看起来好像您正在动态生成 Lua 脚本......

    【讨论】:

    • 好像是这个问题,谢谢。我不知道eval() 脚本在执行后会保存在内存中。
    • RTFM ;) "执行的脚本保证永远存在于 Redis 实例的给定执行的脚本缓存中。" - redis.io/commands/eval
    • 是的,你是对的,但这是 12 页的东西,看起来很简单,并且可以从其他语言中知道(许多语言实现 eval,但我不知道有任何其他语言将代码存储在内存中...)
    • 魔鬼在细节中 - 不过很高兴为您解决了问题。顺便说一句,您是否正在即时生成脚本?我想不出 Lua 缓存变得如此之大的另一个原因。
    • 好。或者,您仍然可以对其进行 EVAL,但请确保将键名作为参数传递给“静态”脚本。
    猜你喜欢
    • 2016-06-20
    • 2021-10-16
    • 2012-10-31
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多