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

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

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

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


当前回答

现在,Redis的写访问问题在官方的Redis docker容器中重新出现,给客户端这个错误消息。

来自官方Redis映像的Redis试图将.rdb文件写入containers /data文件夹中,这是相当不幸的,因为它是一个根目录拥有的文件夹,而且它也是一个非持久化的位置(如果容器/pod崩溃,写入那里的数据将消失)。

所以在一个小时的不活动后,如果你以非根用户运行你的redis容器(例如docker run -u 1007而不是默认的docker run -u 0),你会在你的服务器日志中得到一个非常详细的错误信息(参见docker logs redis):

1:M 29 Jun 2019 21:11:22.014 * 1 changes in 3600 seconds. Saving...
1:M 29 Jun 2019 21:11:22.015 * Background saving started by pid 499
499:C 29 Jun 2019 21:11:22.015 # Failed opening the RDB file dump.rdb (in server root dir /data) for saving: Permission denied
1:M 29 Jun 2019 21:11:22.115 # Background saving error

所以你需要做的是将容器的/data文件夹映射到一个外部位置(非根用户,这里:1007,有写权限,比如主机上的/tmp),例如:

docker run --rm -d --name redis -p 6379:6379 -u 1007 -v /tmp:/data redis

所以这是官方docker镜像的错误配置(应该写入/tmp而不是/data),产生了这个“定时炸弹”,你很可能只会在生产中遇到…在某个特别安静的假日周末过夜:/

其他回答

现在,Redis的写访问问题在官方的Redis docker容器中重新出现,给客户端这个错误消息。

来自官方Redis映像的Redis试图将.rdb文件写入containers /data文件夹中,这是相当不幸的,因为它是一个根目录拥有的文件夹,而且它也是一个非持久化的位置(如果容器/pod崩溃,写入那里的数据将消失)。

所以在一个小时的不活动后,如果你以非根用户运行你的redis容器(例如docker run -u 1007而不是默认的docker run -u 0),你会在你的服务器日志中得到一个非常详细的错误信息(参见docker logs redis):

1:M 29 Jun 2019 21:11:22.014 * 1 changes in 3600 seconds. Saving...
1:M 29 Jun 2019 21:11:22.015 * Background saving started by pid 499
499:C 29 Jun 2019 21:11:22.015 # Failed opening the RDB file dump.rdb (in server root dir /data) for saving: Permission denied
1:M 29 Jun 2019 21:11:22.115 # Background saving error

所以你需要做的是将容器的/data文件夹映射到一个外部位置(非根用户,这里:1007,有写权限,比如主机上的/tmp),例如:

docker run --rm -d --name redis -p 6379:6379 -u 1007 -v /tmp:/data redis

所以这是官方docker镜像的错误配置(应该写入/tmp而不是/data),产生了这个“定时炸弹”,你很可能只会在生产中遇到…在某个特别安静的假日周末过夜:/

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

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

重新启动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数据,所以要小心你在做什么。

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

在我绞尽脑汁思考了这么多so问题之后,终于 对我来说,@Axel Advento的回答奏效了,但没有额外的步骤- 我仍然面临许可问题。 我必须切换用户到redis,在它的home目录中创建一个新目录,然后将其设置为redis的目录。

sudo su - redis -s /bin/bash
mkdir redis_dir
redis-cli CONFIG SET dir $(realpath redis_dir)
exit # to logout from redis user (optional)