← ReJava · 学习目录

REJAVA / LEARNING NOTES

第18课速查:Redis(内存数据存储)持久化

随时回查术语、规则和示例;完整解释见对应课程。

Java 17 / 21更新于 2026.10.12约 4 分钟阅读

根据课程材料整理

本次更新说明
  • 整理为公开学习笔记,保留要点、对照表与练习入口。

完整课件 · 课程目录 · 双语术语 · 官方来源

两种方式对照

RDB(快照文件)AOF(追加写日志)
记什么某一时刻整个数据集的二进制快照,默认 dump.rdb每一条修改数据的命令,按协议格式追加;7.0起 base+incr+manifest 放在 appendonlydir
怎么生成save规则(默认 3600/1、300/100、60/10000)或 BGSAVE(后台保存);fork(创建子进程)子进程写临时文件再替换,父进程不做磁盘I/O,写时复制appendonly yes 后每条写命令追加;越写越大靠重写,手动 BGREWRITEAOF(后台重写追加日志)或自动 auto-aof-rewrite-percentage 100 / min-size 64mb
断电丢多少最近几分钟(上次快照之后的全部)看 appendfsync(追加日志刷盘策略):always 几乎不丢;everysec(默认)约1秒;no 约30秒(Linux默认)
好处文件紧凑、适合备份、大数据集重启快更耐久;只追加无寻道;尾部半条命令可丢弃照常加载
代价fork(创建子进程)停顿(约9 ms/GB,虚拟机更差);非正常停机丢几分钟文件更大、磁盘写入多;7.0前重写期间内存缓冲、双写

appendfsync(追加日志刷盘策略) 三档 = 第14课的三个阶段

档位命令停在哪断电丢多少
always③ 每批命令写入后立刻fsync(强制同步到磁盘),回复前完成(组提交)几乎不丢;官方只说“very safe”
everysec(默认)② 后台线程每秒fsync(强制同步到磁盘)一次约1秒;只是Redis(内存数据存储)进程崩溃、系统正常时只丢一条
no② 何时fsync(强制同步到磁盘)由操作系统决定Linux通常约30秒

“everysec最多丢2秒”没有官方依据;官方的“两秒”是fsync(强制同步到磁盘)未完成时推迟write的上限,是延迟不是丢失量。

重写与7.0多文件AOF(追加写日志)

  • 重写=按当前内存数据生成重建所需的最短命令序列,替换旧日志;子进程完成。
  • 7.0起:安排重写时父进程打开新的incr文件继续写,子进程生成新base,清单文件原子切换。7.0前要把重写期间的命令缓冲在内存、再追加,占内存且写两次。
  • aof-use-rdb-preamble yes:base文件用RDB(快照文件)格式,加载更快;4.0.0默认no,5.0.0起默认yes。常见资料叫“混合持久化”,官方叫RDB(快照文件) preamble。
  • 快照与重写不会同时进行。

两个都开时

  • 重启只加载AOF(官方:它保证最完整),不比较哪个文件更新,不读dump.rdb。
  • 坑: 已有数据的实例直接把配置改成 appendonly yes 再重启,会加载空的AOF(追加写日志)目录、数据为空。官方步骤:备份dump.rdb → 运行中 CONFIG SET appendonly yes → 确认写入正常 → 更新配置文件 → 重启前用 INFO persistence 确认重写完成。
  • RDB(快照文件)生成后不再修改、写完才原子改名,运行中可直接复制备份;定时留快照并传到机房外。

怎么选(官方建议)

情况建议
想要接近PostgreSQL(一种关系型数据库)的数据安全RDB(快照文件)+AOF(追加写日志),appendfsync(追加日志刷盘策略) everysec
在意数据但能接受灾难时丢几分钟只开RDB(快照文件)
纯缓存,数据能从数据库重建不持久化,或只开RDB(快照文件)让重启后缓存不为空
只开AOF(追加写日志)官方不鼓励:定期RDB(快照文件)对备份、快速重启、AOF(追加写日志)引擎出bug时都有用

延迟从安全到快:AOF(追加写日志)+always → AOF(追加写日志)+everysec → AOF(追加写日志)+everysec+重写时不fsync(强制同步到磁盘) → AOF(追加写日志)+no → 只RDB(快照文件)。

一分钟表达

Redis(内存数据存储)有RDB(快照文件)和AOF(追加写日志)两种持久化。RDB(快照文件)是定期对整个数据集做快照,fork(创建子进程)子进程写文件、父进程继续服务,文件紧凑、重启快,但断电会丢上次快照之后的几分钟。AOF(追加写日志)把每条写命令追加到日志,重启时重放,默认每秒fsync(强制同步到磁盘)一次,断电最多丢一秒;文件会越写越大,靠重写压缩成最短命令序列,7.0起拆成基础文件加增量文件,重写期间父进程直接写新的增量文件。两个都开时重启只读AOF(追加写日志)。生产上看业务:纯缓存可以不持久化,只在Redis(内存数据存储)里的计数和状态就两个都开、用everysec;在已有实例上开AOF(追加写日志)要先在运行中用CONFIG SET开启,再改配置文件。

回到应用题算一算重启后还剩什么。丢失量均为官方文档的说法,没有实际做断电或重启实验;速查表只用于复习,读懂它不等于已经能独立讲清。