Redis An unhandled exception has occurred while executing the request. MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.
错误信息:
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware|ERROR|
An unhandled exception has occurred while executing the request.
MISCONF Redis is configured to save RDB snapshots,
but it is currently not able to persist on disk.
Commands that may modify the data set are disabled,
because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option).
Please check the Redis logs for details about the RDB error.
原因:
强制把redis快照关闭了导致不能持久化的问题。(BGSAVE失败导致,而导致其失败的大多数原因是 fork 无法分配内存)。
关于内存的大概原因如下:
1,磁盘出现损坏(很少出现)
2,写持久化数据的磁盘满了
3,磁盘访问不到了(针对远程存储)
4,对磁盘的访问权限不足(应该是最多发生的)
5,磁盘空间不足
具体的原因可查看redis的日志可在配置文件中搜索“logfile”查看保存位置
解决方法:
1. 临时解决的方式,在Redis的配置文件 redis.windows.conf上将stop-writes-on-bgsave-error值配置为no(默认值为yes),重启redis服务
设置为yes表示 redis 会创建一个新的后台进程dump rdb。
假如创建快照(硬盘上,产生一个新的rdb文件),期间redis的主进程仍然接受客户端的请求,但此快照创建失败了,多数为内存原因引起,此时就会抛出如上异常,
那么,redis会,拒绝新的写入,也就是说,它认为你当下的持久化数据出现了问题,就停止操作了
no:表示bgsave快照操作出错时停止写数据到磁盘。
2. 针对系统空间足够,但还是提示内存不足的情况(fork进程分配不到内存是因为跟操作系统的优化相冲突)可以使用如下方式:
vm.overcommit_memory设置为1,默认值是0
0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2: 表示内核允许分配超过所有物理内存和交换空间总和的内存。
关于BGSAVE:
在后台异步(Asynchronously)保存当前数据库的数据到磁盘。
BGSAVE 命令执行之后立即返回 OK
,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
客户端可以通过LASTSAVE 命令查看相关信息,判断BGSAVE 命令是否执行成功。
地址:http://redisdoc.com/persistence/bgsave.html#bgsave
关于问题解释的详细帖子:
https://stackoverflow.com/questions/60110452/using-redis-with-docker-compose-misconf-redis-is-configured-to-save-rdb-snapsho