由于内存分配问题,当redis无法在后台保存时对lua脚本的影响

时间:2017-02-27 23:35:14

标签: django lua redis

我最近在Django应用程序中添加了一些Lua脚本(用于与Redis后端连接)。在生产中(虽然不在开发中),设置最终会给我以下错误:

sum()

发生这种情况时,如果我查看redis日志,我就会看到Error running script (call to f_8c07b227bc796743f66bad8dbe75a5bf8fcc8cd6): @user_script:2: @user_script: 2: -MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

我得到了正在发生的事情。我的问题是,当内存不能被分配用于后台保存时,redis仍然可以运行,但是lua脚本会崩溃吗?有没有办法避免这种情况?

仅供参考,以下是我的can't save in background: fork: Cannot allocate memory模块的布局方式:

lua_scripts.py

1 个答案:

答案 0 :(得分:1)

错误消息告诉您所有内容:禁用可能修改数据集的命令。

Redis尝试派一个新进程来执行后台保存,但由于内存不足而失败。在这种情况下,Redis会禁用对数据库的任何更新。否则,内存中的数据和磁盘上的数据将不一致。

  

当内存无法分配用于后台保存时,如何使redis保持正常运行

Redis仍然可以提供只读请求,并拒绝任何可能修改数据库的请求。

  

但是lua脚本崩溃了?

你的lua脚本试图修改数据库,例如redis.call('ZADD', KEYS[1], ARGV[1], ARGV[2] .. ':' .. ARGV[3]),然后失败。

  

有没有办法避免这种情况?

  1. 您应该监控此类错误,并将Redis移至具有更多内存以扩展的新计算机,或使用Redis群集向外扩展。

  2. 在您的lua脚本中,使用redis.pcall代替redis.call。如果redis.call失败,则整个脚本将终止。但是,如果redis.pcall失败,它会捕获错误并返回错误消息的lua表。您可以检查返回的表格以查看您的呼叫是否成功运行。