在写入Redis (SET foo bar)期间,我得到以下错误:
MISCONF Redis被配置为保存RDB快照,但当前为 无法在磁盘上持久保存。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看Redis日志。
基本上我理解的问题是,redis是不能在磁盘上保存数据,但不知道如何摆脱这个问题。
下面的问题也有同样的问题,它在很久以前就被抛弃了,没有答案,很可能没有尝试解决这个问题。
在写入Redis (SET foo bar)期间,我得到以下错误:
MISCONF Redis被配置为保存RDB快照,但当前为 无法在磁盘上持久保存。可能修改数据集的命令是 禁用。有关错误的详细信息,请查看Redis日志。
基本上我理解的问题是,redis是不能在磁盘上保存数据,但不知道如何摆脱这个问题。
下面的问题也有同样的问题,它在很久以前就被抛弃了,没有答案,很可能没有尝试解决这个问题。
当前回答
检查dir: var/lib/redis的权限,应该是redis:redis
其他回答
检查dir: var/lib/redis的权限,应该是redis:redis
此错误是由于BGSAVE失败导致的。在BGSAVE期间,Redis会fork一个子进程来将数据保存到磁盘上。虽然BGSAVE失败的确切原因可以从日志中检查(通常在linux机器上的/var/log/redis/redis-server.log),但很多时候bgive失败是因为fork不能分配内存。很多时候,由于操作系统的优化冲突,fork无法分配内存(尽管机器有足够的可用RAM)。
可以从Redis常见问题中阅读:
Redis background saving schema relies on the copy-on-write semantic of fork in modern operating systems: Redis forks (creates a child process) that is an exact copy of the parent. The child process dumps the DB on disk and finally exits. In theory the child should use as much memory as the parent being a copy, but actually thanks to the copy-on-write semantic implemented by most modern operating systems the parent and child process will share the common memory pages. A page will be duplicated only when it changes in the child or in the parent. Since in theory all the pages may change while the child process is saving, Linux can't tell in advance how much memory the child will take, so if the overcommit_memory setting is set to zero fork will fail unless there is as much free RAM as required to really duplicate all the parent memory pages, with the result that if you have a Redis dataset of 3 GB and just 2 GB of free memory it will fail. Setting overcommit_memory to 1 says Linux to relax and perform the fork in a more optimistic allocation fashion, and this is indeed what you want for Redis.
Redis不需要像操作系统认为的那样多的内存来写入磁盘,所以可能会预先导致fork失败。
要解决这个问题,您可以:
修改/etc/sysctl.conf,增加:
vm.overcommit_memory=1
然后重新启动sysctl:
在FreeBSD上:
sudo /etc/rc.d/sysctl reload
在Linux上:
sudo sysctl -p /etc/sysctl.conf
重新启动redis服务器。
macOS (brew): brew服务重启redis。 Linux: sudo service redis restart / sudo systemctl restart redis . sh Windows: Windows + R ->类型服务。msc,输入->搜索Redis,然后单击restart。
我个人在用Brew升级redis (Brew升级)后遇到了这个问题。 重启笔记本电脑后,它立即工作了。
在采取任何行动之前检查你的Redis日志。这个线程中的一些解决方案可能会删除你的Redis数据,所以要小心你在做什么。
在我的例子中,机器的内存快用完了。当主机上没有更多的空闲磁盘空间时,也会发生这种情况。
如果你遇到错误,一些重要的数据不能被丢弃在运行的redis实例上(rdb文件或其目录的权限不正确,或运行出磁盘空间),你总是可以重定向rdb文件写入其他地方。
使用redis-cli,你可以这样做:
CONFIG SET dir /tmp/some/directory/other/than/var
CONFIG SET dbfilename temp.rdb
在此之后,您可能想要执行BGSAVE命令,以确保数据将被写入rdb文件。确保当你执行INFO持久化时,bgsave_in_progress已经是0,rdb_last_bgsave_status是ok。在此之后,您现在可以开始在安全的地方备份生成的rdb文件。