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

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

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

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


当前回答

正如@Chris指出的,问题可能是低内存。当我们分配太多内存给MySQL (innodb_buffer_pool_size)时,我们就开始遇到这种情况。

为了确保有足够的内存用于Redis和其他服务,我们减少了MySQL上的innodb_buffer_pool_size。

其他回答

我也遇到过类似的问题,这背后的主要原因是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

在采取任何行动之前检查你的Redis日志。这个线程中的一些解决方案可能会删除你的Redis数据,所以要小心你在做什么。

在我的例子中,机器的内存快用完了。当主机上没有更多的空闲磁盘空间时,也会发生这种情况。

在redis.conf第235行,让我们像这样修改配置

- stop-writes-on-bgsave-error yes
+ stop-writes-on-bgsave-error no

在Redis有写权限的目录下启动Redis服务器

上面的答案肯定能解决你的问题,但实际情况是这样的:

存储rdb的默认位置。转储文件为。/(表示当前目录)。您可以在redis.conf文件中验证这一点。因此,启动redis服务器的目录就是转储文件所在的目录。RDB文件将被创建和更新。

似乎您已经开始运行redis服务器在一个目录,其中redis没有正确的权限来创建转储。rdb文件。

更糟糕的是,redis可能也不允许你关闭服务器,直到它能够创建rdb文件,以确保正确保存数据。

要解决这个问题,你必须使用redis-cli进入活动的redis客户端环境,更新dir键,并将其值设置为你的项目文件夹或任何非root用户有权限保存的文件夹。然后运行BGSAVE调用转储的创建。rdb文件。

CONFIG SET dir "/hardcoded/path/to/your/project/folder"
BGSAVE

(现在,如果您需要保存转储。RDB文件在您启动服务器的目录中,然后您需要更改该目录的权限,以便redis可以写入它。您可以搜索stackoverflow如何做到这一点)。

你现在应该可以关闭redis服务器了。注意,我们对路径进行了硬编码。硬编码很少是一个好的实践,我强烈建议从你的项目目录启动redis服务器,并将dir键更改回。/ '。

CONFIG SET dir "./"
BGSAVE

这样,当您需要redis为另一个项目时,转储文件将创建在当前项目的目录中,而不是在硬编码路径的项目目录中。

在我的例子中,原因是磁盘的可用空间非常低(只有35 Mb)。我做了以下的事情

停止所有Redis相关进程 删除磁盘中的一些文件,以腾出足够的空间 删除redis转储文件(如果不需要现有数据) Sudo rm /var/lib/redis/* 删除所有现有数据库的所有键 Sudo redis-cli flushall 重新启动所有芹菜任务,并检查相应的日志是否有任何问题