在写入Redis (SET foo bar)期间,我得到以下错误:

MISCONF Redis被配置为保存RDB快照,但当前为 无法在磁盘上持久保存。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看Redis日志。

基本上我理解的问题是,redis是不能在磁盘上保存数据,但不知道如何摆脱这个问题。

下面的问题也有同样的问题,它在很久以前就被抛弃了,没有答案,很可能没有尝试解决这个问题。


当前回答

检查dir: var/lib/redis的权限,应该是redis:redis

其他回答

我也遇到过类似的问题,这背后的主要原因是redis的内存消耗。 我的EC2机器有8GB内存(大约7.4 gb可用)

当我的程序运行时,RAM使用率上升到7.2 GB,只剩下大约100MB的RAM,这通常会触发MISCONF Redis错误…

可以使用htop命令确定内存消耗。执行htop命令后,查找Mem属性。如果它显示出较高的消耗(比如我的情况是7.2GB/7.4GB),那么最好将实例升级为更大的内存。 在这种情况下,使用set stop-writes-on-bgsave-error no对服务器来说将是一场灾难,并可能导致中断服务器上运行的其他服务(如果有的话)。所以,最好避免配置命令和升级你的REDIS机器。

供您参考:您可能需要安装htop才能使其工作:sudo apt-get install htop

另一种解决方案是在你的系统上运行一些其他的内存大的服务,检查在你的服务器/机器/实例上运行的其他服务,如果没有必要就停止它。要检查机器上运行的所有服务,请使用service——status-all

对于那些直接粘贴config命令的人,建议在使用这些命令之前,请做一些研究,至少警告用户。正如@Rodrigo在评论中提到的:“忽视错误看起来并不酷。”

——更新

你也可以配置maxmemory和maxmemory-policy来定义当达到特定的内存限制时Redis的行为。 例如,如果我想保持6GB的内存限制,并从DB中删除最近最少使用的键,以确保redis mem的使用不超过6GB,那么我们可以设置以下两个参数(在redis.conf或CONFIG set命令中):

maxmemory 6gb
maxmemory-policy allkeys-lru

你可以为这两个参数设置很多其他的值,你可以从这里阅读:https://redis.io/topics/lru-cache

如果你在windows机器上本地运行Redis,试着“以管理员身份运行”,看看它是否有效。对我来说,问题是Redis位于“程序文件”文件夹中,默认情况下会限制权限。这是应该的。

但是,不要以管理员身份自动运行Redis。你不会想要授予它更多的权限。你想按规矩办事。

因此,我们能够通过作为管理员运行它来快速识别问题,但这不是解决方法。一种可能的情况是,你把Redis放在一个没有写权限的文件夹中,结果DB文件被存储在同一个位置。

您可以通过打开redis.windows.conf并搜索以下配置来解决此问题:

    # The working directory.
    #
    # The DB will be written inside this directory, with the filename specified
    # above using the 'dbfilename' configuration directive.
    #
    # The Append Only File will also be created inside this directory.
    #
    # Note that you must specify a directory here, not a file name.
    dir ./

将dir ./更改为具有常规读写权限的路径

你也可以将Redis文件夹整体移动到一个你知道拥有正确权限的文件夹。

所有这些答案都不能解释RDB保存失败的原因。


作为我的情况,我检查了redis日志,发现:

14975:M 18 Jun 13:23:07.354 #后台保存被信号9终止

在终端执行如下命令:

sudo egrep -i -r 'killed process' /var/log/

它显示:

/var/log/kern.log.1:Jun 18 13:23:07 10-10-88-16 kernel: [28152358.208108] Killed process 28416 (redis-server) total-vm:7660204kB, anon-rss:2285492kB, file-rss:0kB

就是这样!这个进程(redis保存rdb)被OOM杀手杀死

是指:

https://github.com/antirez/redis/issues/1886

查找哪个进程被Linux OOM杀手杀死

由于内存不足,bgsave过程中可能会出现错误。试试这个(从redis后台保存FAQ)

echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1

在我的情况下,它发生了,因为我刚刚安装了redis使用快速的方式。所以redis不是以根用户身份运行。 我可以按照他们快速入门指南中“更正确地安装Redis”部分的说明来解决这个问题。这样做之后,问题得到了解决,redis现在以根用户身份运行。来看看。