停机时的保存行为
SHUTDOWN 是让 Redis 优雅退出的命令:默认行为取决于持久化配置,开启 RDB 时会先保存快照再退出,开启 AOF 时会先刷写并关闭 AOF。SHUTDOWN NOSAVE 则跳过保存直接退出,只在明确不需要内存数据的场景使用。理解这套默认逻辑,才能解释「为什么 kill -9 之后数据丢了」。
基本信息
| 适用平台 | Redis 全版本;命令名与语义长期稳定 |
|---|---|
| 语法 | SHUTDOWN [NOSAVE | SAVE] [NOW] [FORCE] [ABORT] |
| 默认行为 | 按持久化配置决定是否保存,通常是保存后退出 |
| AOF 场景 | 正常退出会把 AOF 缓冲区刷盘 |
| 替代方式 | systemctl stop redis 会触发同样的优雅退出流程 |
典型使用场景
- 计划内维护停机:先确认快照状态再执行优雅关闭
- 变更配置前重启实例:用 SHUTDOWN SAVE 保证数据落盘
- 容器化部署的停止流程:理解 stop 信号触发的保存行为
- 故障演练:验证强杀与优雅关闭的数据差异
- 迁移实例前主动落盘,避免恢复时数据回退
标准停机流程
标准停机流程
# 停机前先确认上一次持久化是否正常
INFO persistence | grep rdb_last_bgsave_status
INFO persistence | grep aof_last_bgrewrite_status
# 保存快照后退出(默认行为,显式写出更清晰)
SHUTDOWN SAVE
# 明确不需要数据时跳过保存
SHUTDOWN NOSAVE
# systemd 环境下的等价做法
systemctl stop redis
# 强杀(相当于跳过保存,通常不是想要的效果)
# kill -9 $(pidof redis-server)停机方式对照
| 方式 | 是否保存 | 适用 |
|---|---|---|
| SHUTDOWN SAVE | 保存 RDB 后退出 | 计划内维护、变更重启 |
| SHUTDOWN 默认 | 按持久化配置执行 | 常规停机 |
| SHUTDOWN NOSAVE | 跳过保存 | 确认数据可丢的临时实例 |
| systemctl stop | 走优雅退出流程 | 生产环境标准做法 |
| kill -9 | 不保存,AOF 可能丢缓冲 | 仅限进程无响应时使用 |
SHUTDOWN 执行后客户端连接会断开并收到错误,这是正常现象;脚本里应把连接中断视为预期结果而不是失败重试。
停机前不检查快照状态:带着失败的快照直接停机,下次启动会加载更早的数据,看起来像「重启后数据回退」。