Redis 持久化与内存淘汰:宕机丢多少数据?
知识背景
Redis 数据主要在内存,宕机或重启后是否可恢复取决于 持久化策略。RDB 快照与 AOF 追加日志是两种主路径;同时 maxmemory 与 淘汰策略 决定内存打满时删哪些 key。后端选型要回答:能丢多久数据、恢复要多快、内存上限多少。
知识详解与通俗解释
1. RDB(快照)
在某一时刻把内存数据 fork 子进程 写到磁盘(二进制紧凑)。
- 优点:恢复快、文件小。
- 缺点:两次快照之间的写入可能丢失;
fork在数据量大时对 CPU/内存 有瞬时压力。
通俗说:定期拍一张全班合影;两次拍照之间新来的同学可能没进相册。
2. AOF(Append Only File)
把每条写命令追加到日志;重启时 重放 恢复。
appendfsync always:最安全,性能差。everysec:每秒刷盘,折中常用。no:交给 OS,快但可能丢更多。
AOF 可 重写 压缩体积。
3. 混合持久化(Redis 4+)
RDB 打底 + AOF 增量,兼顾恢复速度与数据安全,生产常见配置方向之一。
4. 内存淘汰策略(maxmemory-policy)
内存到 maxmemory 时,例如:
- volatile-lru:从设了过期时间的 key 里 LRU 淘汰。
- allkeys-lru:所有 key 里 LRU。
- volatile-ttl:优先淘汰即将过期的。
- noeviction:不淘汰,写命令报错(缓存场景要谨慎)。
通俗说:房子满了要么扔旧东西(淘汰),要么拒绝再买(noeviction)。
总结
- RDB 像快照,AOF 像账本;混合可兼顾。
- 接受多少数据丢失 = 持久化频率 + fsync 策略 的权衡。
- 淘汰策略与业务 key 是否设 TTL 强相关,上线前要显式配置,避免默认不符合预期。