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

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

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

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


当前回答

在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为另一个项目时,转储文件将创建在当前项目的目录中,而不是在硬编码路径的项目目录中。

其他回答

使用redis-cli,你可以阻止它尝试保存快照:

config set stop-writes-on-bgsave-error no

这是一个快速的解决方法,但是如果你关心使用它的数据,你应该检查一下为什么bgsave首先失败了。

如果你在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文件夹整体移动到一个你知道拥有正确权限的文件夹。

在我的情况下,这只是特权,我需要允许Redis接受传入的请求。

所以我重启了Redis服务通过Homebrew brew服务停止Redis和brew服务启动Redis和运行Redis服务器本地Redis -server。命令提示符要求我允许传入请求,然后它开始工作。

$ redis-cli

设置stop-writes-on-bgsave-error no

根据Redis文档,只有当您没有启用RDB快照或您不关心快照中的数据持久性时,才建议这样做。

默认情况下,如果RDB快照启用(至少一个保存点)并且最近的后台保存失败,Redis将停止接受写入。这将使用户意识到(以一种艰难的方式)数据没有正确地保存在磁盘上,否则,强文本的机会是没有人会注意到,并且会发生一些灾难。”

你应该做的是:

# redis-cli
127.0.0.1:6379> CONFIG SET dir /data/tmp
OK
127.0.0.1:6379> CONFIG SET dbfilename temp.rdb
OK
127.0.0.1:6379> BGSAVE
Background saving started
127.0.0.1:6379>

请确保/data/tmp有足够的磁盘空间。

我知道这个线程稍微老一些,但当我早些时候得到这个错误时,这里是为我工作的,因为我知道我没有接近内存限制-两个答案都在上面找到。

希望这能在将来帮助到需要的人。

检查CHMOD目录…发现符号符号不一样。CHMOD目录文件夹到755 Dbfilename权限很好,不需要更改 重启redis-server 参考redis-server.log,发现该错误是访问被拒绝的结果。

再次-不确定DIR文件夹的权限是如何改变的,但我假设CHMOD回到755并重新启动redis-server,因为我之后能够ping到redis服务器。

另外,需要注意的是,redis确实拥有dbfilename和DIR文件夹的所有权。