REJAVA / LEARNING NOTES
第18课速查:Redis(内存数据存储)持久化
随时回查术语、规则和示例;完整解释见对应课程。
根据课程材料整理
本次更新说明
- 整理为公开学习笔记,保留要点、对照表与练习入口。
两种方式对照
| 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开启,再改配置文件。
回到应用题算一算重启后还剩什么。丢失量均为官方文档的说法,没有实际做断电或重启实验;速查表只用于复习,读懂它不等于已经能独立讲清。