数据在内存里,重启不就没了

Redis 是内存数据库,读写极快,但进程重启或机器断电时内存数据就没了。如果拿它当缓存,丢了可以从数据库回填;如果拿它当存数据的地方(会话、计数器、排行榜),丢了就是事故。持久化就是把内存数据以某种形式写到磁盘,重启后能恢复。Redis 提供两种主要方式:RDB 快照和 AOF 日志。

本文核心知识点
  • RDB某一时刻全量数据的快照文件。
  • AOF追加写命令的日志,更接近实时。
  • 混合持久化RDB 全量加 AOF 增量。
  • 淘汰策略内存满时按规则腾地方。
Redis 持久化配图:蓝色渐变背景左侧相机快照方块向下发光箭头汇入中央彩色键值方块堆,右侧顺序日志长条方块汇入,底部漏斗方块,扁平科技插画
快照与日志两路汇入内存数据集、底部漏斗做淘汰,正是 Redis 持久化的意象。

RDB 快照:定时存一份

RDB 按配置(比如 N 秒内超过 M 次写)触发,fork 出子进程把当时的全量数据写成一个紧凑的二进制文件。优点是文件小、恢复快;缺点是两次快照之间宕机,这部分新写的数据就丢了。适合对丢失容忍度稍高、追求快速恢复的场景。

AOF:每条写命令都记下来

AOF 把每一条修改数据的写命令追加到日志文件。重启时重放这些命令就能恢复数据。它通过刷盘策略控制安全与性能平衡:always 每次写都刷最安全但最慢,everysec 每秒刷一次(默认,最多丢一秒),no 交给系统。AOF 文件会越来越大,需要定期重写压缩。

# redis.conf 常用配置
appendonly yes            # 开启 AOF
appendfsync everysec      # 每秒刷盘
auto-aof-rewrite-percentage 100

混合持久化:两者结合

Redis 4.0 起支持混合持久化:AOF 重写时,把当前全量数据用 RDB 格式写在 AOF 文件开头,之后的增量写命令再以 AOF 格式追加。恢复时先加载 RDB 全量、再重放少量增量日志,兼具恢复快和丢失少,是现在生产的推荐做法。