这不是 redis 挂了,而是它主动锁死写入——90% 根因是磁盘空间不足或权限问题;真实线索在日志中“permission denied”或“no space left on device”,而非客户端报的misconf错误。

直接结论:这不是 Redis 挂了,而是它主动锁死了写入——根本原因 90% 是磁盘空间或权限问题,不是配置开关本身。
查日志里那句真实的系统错误
Redis 日志(如 /var/log/redis/redis-server.log)里那行 Can't open the RDB file for writing: Permission denied 或 No space left on device 才是真实线索。别只盯着客户端返回的 MISCONF Redis is configured to save RDB snapshots...,那是结果,不是原因。
- 用
tail -n 50 /var/log/redis/redis-server.log快速翻最近错误 - 重点找含
Failed opening、fork: Cannot allocate memory、No space left on device的行 - 如果日志为空或没权限读,先确认
logfile配置是否生效,或改用redis-cli INFO server | grep log查路径
验证磁盘空间与 inode 是否真实耗尽
RDB 是全量快照,一次 BGSAVE 峰值占用 ≈ 2 × 当前内存数据体积;AOF 重写期间可能三份文件并存。光看 df -h 显示“还有 10%”不够,必须交叉验证。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 运行
df -h /var/lib/redis(把路径换成redis-cli CONFIG GET dir返回的实际值) - 再跑
df -i /var/lib/redis,IUse%超过 95% 就得清 inode(常见于大量小日志或临时文件) - 用
redis-cli INFO memory | grep used_memory_human看当前内存用量,若比磁盘剩余空间还大,RDB 必败 - 手动测写入:
touch /var/lib/redis/test.txt—— 失败则基本锁定权限或空间问题
检查 dir 目录是否存在、属主与最小权限
Redis 不会自动创建 dir 配置的路径,也不校验权限。常见错误是目录存在但属主是 root,而 Redis 进程以 redis 用户运行。
- 执行
redis-cli CONFIG GET dir获取实际路径 - 运行
ls -ld /var/lib/redis,确认输出中第三列(属主)和第四列(属组)匹配 Redis 运行用户(用ps -ef | grep redis-server查) - 若属主不符,用
chown redis:redis /var/lib/redis修正(把redis替换为实际用户) - 权限位应至少为
drwxr-xr-x(即 755),避免用chmod 777—— SELinux 启用时会直接拒绝
别碰 stop-writes-on-bgsave-error,先修根因
这个配置默认是 yes,它是保护机制:若 RDB 持续失败还允许写,重启后数据就全丢了。临时设为 no 只是掩盖问题,不解决任何实质风险。
- 用
redis-cli CONFIG GET stop-writes-on-bgsave-error确认当前值,但别急着改 - 改完后
INFO persistence里rdb_last_bgsave_status仍是err?说明磁盘或权限问题还在 - 真正要盯的是
rdb_last_save_time是否更新、rdb_changes_since_last_save是否持续增长
最容易被忽略的一点:磁盘监控显示“可用”,但 I/O 队列已满或 ext4 预留空间(默认 5%)不可用,也会导致 No space left on device。用 dd if=/dev/zero of=/tmp/test bs=1M count=100 粗略验证写延迟是否异常高,比纯看数字更接近真实瓶颈。










