解讀Redis的持久化方式(RDB、AOF)
一、核心概念回顧
RDB vs AOF 對(duì)比
| 特性 | RDB (快照) | AOF (日志) |
|---|---|---|
| 原理 | 定時(shí)全量快照 | 記錄每條寫(xiě)命令 |
| 文件格式 | 二進(jìn)制 (.rdb) | 文本日志 (.aof) |
| 文件大小 | 小 | 大 |
| 恢復(fù)速度 | 快 (直接加載) | 慢 (重放命令) |
| 數(shù)據(jù)完整性 | 可能丟失快照間數(shù)據(jù) | 可做到秒級(jí)甚至實(shí)時(shí) |
| 性能影響 | 快照時(shí) fork 子進(jìn)程 | 持續(xù)寫(xiě)磁盤(pán),有開(kāi)銷 |
二、同時(shí)開(kāi)啟 RDB+AOF 的工作機(jī)制
1. 寫(xiě)入流程(雙寫(xiě)機(jī)制)
┌─────────────────────────────────────────────────────────────────┐
│ Redis 寫(xiě)操作流程 │
└─────────────────────────────────────────────────────────────────┘
?
寫(xiě)命令 (SET/DEL/HSET...)
↓
┌───────────────┐
│ 內(nèi)存數(shù)據(jù) │ ← 立即執(zhí)行
└───────┬───────┘
│
┌───────┴───────┐
↓ ↓
┌──────────────┐ ┌──────────────┐
│ RDB 快照 │ │ AOF 日志 │
│ (定時(shí)觸發(fā)) │ │ (實(shí)時(shí)追加) │
│ .rdb 文件 │ │ .aof 文件 │
└──────────────┘ └──────────────┘關(guān)鍵點(diǎn):
RDB:按配置的時(shí)間間隔觸發(fā)(如 900 秒有 1 次修改)
AOF:每條寫(xiě)命令都記錄(根據(jù) fsync 策略決定何時(shí)落盤(pán))
2. 混合持久化(Redis 4.0+ 核心特性)
這是最重要的配置!Redis 4.0 引入了 AOF-RDB 混合持久化:
┌─────────────────────────────────────────────────────────────────┐ │ 混合持久化文件格式 │ └─────────────────────────────────────────────────────────────────┘ ? appendonly.aof 文件結(jié)構(gòu): ┌─────────────────────────────────────────────────────────────────┐ │ 頭部:RDB 格式快照數(shù)據(jù) (全量數(shù)據(jù)) │ │ ───────────────────────────────────────────────────────────── │ │ 尾部:AOF 格式增量命令 (RDB 之后的寫(xiě)操作) │ │ ───────────────────────────────────────────────────────────── │ │ 結(jié)尾:EOF 標(biāo)記 │ └─────────────────────────────────────────────────────────────────┘ ? 優(yōu)勢(shì): ? 恢復(fù)時(shí)先加載 RDB 快照(快) ? 再重放少量 AOF 增量命令(數(shù)據(jù)完整) ? 兼顧速度和完整性
配置項(xiàng):
# redis.conf aof-use-rdb-preamble yes # 開(kāi)啟混合持久化(Redis 4.0+ 默認(rèn)開(kāi)啟)
3. AOF 重寫(xiě)時(shí)的混合機(jī)制
AOF 文件會(huì)越來(lái)越大,需要定期重寫(xiě)(Rewrite):
┌─────────────────────────────────────────────────────────────────┐
│ AOF 重寫(xiě)流程 │
└─────────────────────────────────────────────────────────────────┘
?
重寫(xiě)前 appendonly.aof:
┌─────────────────────────────────────────────────────────────────┐
│ RDB 快照 │ SET k1 v1 │ SET k1 v2 │ DEL k1 │ SET k2 v2 │ ... │
│ (舊數(shù)據(jù)) │ (重復(fù)命令很多,文件膨脹) │
└─────────────────────────────────────────────────────────────────┘
↓ BGREWRITEAOF 觸發(fā)
重寫(xiě)后 appendonly.aof:
┌─────────────────────────────────────────────────────────────────┐
│ RDB 快照 (當(dāng)前最新數(shù)據(jù)) │ SET k2 v2 │ (增量命令) │
│ (緊湊二進(jìn)制) │ (少量新命令) │
└─────────────────────────────────────────────────────────────────┘
?
結(jié)果:
? 文件體積大幅減小
? 恢復(fù)速度更快
? 數(shù)據(jù)不丟失三、重啟恢復(fù)優(yōu)先級(jí)
恢復(fù)順序規(guī)則
┌─────────────────────────────────────────────────────────────────┐
│ Redis 重啟恢復(fù)流程 │
└─────────────────────────────────────────────────────────────────┘
?
Redis 啟動(dòng)
↓
┌───────────────────────┐
│ 檢查持久化文件是否存在 │
└───────────┬───────────┘
│
┌───────────────┼───────────────┐
↓ ↓ ↓
┌─────────┐ ┌─────────┐ ┌─────────┐
│ AOF 存在 │ │ 僅 RDB │ │ 都無(wú) │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
↓ ↓ ↓
優(yōu)先用 AOF 用 RDB 恢復(fù) 空數(shù)據(jù)庫(kù)
(數(shù)據(jù)更完整) (快照數(shù)據(jù)) (無(wú)歷史數(shù)據(jù))
│ │ │
└──────────────┴──────────────┘
↓
┌─────────────────┐
│ 恢復(fù)完成 │
│ 對(duì)外提供服務(wù) │
└─────────────────┘核心原則:
- AOF 優(yōu)先級(jí) > RDB 優(yōu)先級(jí)
- 原因:AOF 數(shù)據(jù)通常比 RDB 更完整(丟失數(shù)據(jù)更少)
四、生產(chǎn)環(huán)境配置推薦
完整配置示例
# ==================== RDB 配置 ==================== dbfilename dump.rdb # RDB 文件名 dir /var/lib/redis # 數(shù)據(jù)目錄 ? # 快照觸發(fā)條件(滿足任一即觸發(fā)) save 900 1 # 900 秒內(nèi)至少 1 個(gè) key 變化 save 300 10 # 300 秒內(nèi)至少 10 個(gè) key 變化 save 60 10000 # 60 秒內(nèi)至少 10000 個(gè) key 變化 ? stop-writes-on-bgsave-error yes # RDB 失敗時(shí)停止寫(xiě)入 rdbcompression yes # 壓縮 RDB 文件 rdbchecksum yes # 校驗(yàn)和 ? # ==================== AOF 配置 ==================== appendonly yes # 開(kāi)啟 AOF appendfilename "appendonly.aof" # AOF 文件名 ? # AOF 落盤(pán)策略(三選一) appendfsync everysec # 推薦:每秒同步(性能與安全平衡) # appendfsync always # 每次寫(xiě)都同步(最安全,性能差) # appendfsync no # 由系統(tǒng)決定(性能最好,可能丟數(shù)據(jù)) ? no-appendfsync-on-rewrite no # 重寫(xiě)時(shí)是否禁用 fsync auto-aof-rewrite-percentage 100 # AOF 增長(zhǎng) 100% 時(shí)觸發(fā)重寫(xiě) auto-aof-rewrite-min-size 64mb # AOF 最小 64MB 才觸發(fā)重寫(xiě) ? # ==================== 混合持久化 ==================== aof-use-rdb-preamble yes # 開(kāi)啟混合持久化(關(guān)鍵!)
五、兩種模式對(duì)比
模式一:傳統(tǒng)雙持久化(Redis 4.0 之前)
┌─────────────────────────────────────────────────────────────────┐ │ 傳統(tǒng)雙持久化 │ └─────────────────────────────────────────────────────────────────┘ ? 文件結(jié)構(gòu): ┌─────────────────────┐ ┌─────────────────────────────────┐ │ dump.rdb │ │ appendonly.aof │ │ (獨(dú)立 RDB 文件) │ │ (純 AOF 日志,無(wú) RDB 前綴) │ │ 全量快照 │ │ 所有寫(xiě)命令 │ └─────────────────────┘ └─────────────────────────────────┘ ? 恢復(fù)時(shí): 1. 優(yōu)先加載 AOF 文件 2. 逐條重放所有命令 3. RDB 文件僅作為備份 ? 缺點(diǎn): ? AOF 文件大 ? 恢復(fù)慢 ? 兩份文件獨(dú)立管理
模式二:混合持久化(Redis 4.0+ 推薦)
┌─────────────────────────────────────────────────────────────────┐ │ 混合持久化 │ └─────────────────────────────────────────────────────────────────┘ ? 文件結(jié)構(gòu): ┌─────────────────────────────────────────────────────────────────┐ │ appendonly.aof (唯一持久化文件) │ │ ┌─────────────────┬───────────────────────────────────────┐ │ │ │ RDB 快照部分 │ AOF 增量命令部分 │ │ │ │ (二進(jìn)制格式) │ (文本命令格式) │ │ │ │ 基礎(chǔ)數(shù)據(jù) │ RDB 之后的寫(xiě)操作 │ │ │ └─────────────────┴───────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ? 恢復(fù)時(shí): 1. 加載 RDB 快照部分(快速) 2. 重放 AOF 增量命令(少量) 3. dump.rdb 文件不再使用 ? 優(yōu)點(diǎn): ? 恢復(fù)速度快 ? 數(shù)據(jù)完整性高 ? 文件管理簡(jiǎn)單
六、實(shí)際場(chǎng)景演示
場(chǎng)景:Redis 重啟恢復(fù)
時(shí)間線: T0: Redis 啟動(dòng),開(kāi)啟 RDB+AOF 混合持久化 T1: 寫(xiě)入 100 萬(wàn)條數(shù)據(jù) T2: 觸發(fā) RDB 快照 → dump.rdb 生成 T3: AOF 持續(xù)記錄寫(xiě)命令 T4: AOF 重寫(xiě) → appendonly.aof 包含 RDB 快照 + 增量命令 T5: Redis 宕機(jī) T6: Redis 重啟 ? 恢復(fù)過(guò)程: ┌─────────────────────────────────────────────────────────────────┐ │ 步驟 1: 檢測(cè)文件 │ │ - 發(fā)現(xiàn) appendonly.aof 存在 │ │ - 發(fā)現(xiàn) dump.rdb 存在(但不用) │ ├─────────────────────────────────────────────────────────────────┤ │ 步驟 2: 加載 AOF 文件 │ │ - 讀取 RDB 前綴部分 → 恢復(fù) 100 萬(wàn)條基礎(chǔ)數(shù)據(jù) (約 2 秒) │ │ - 重放 AOF 增量命令 → 恢復(fù) T4-T5 期間的寫(xiě)操作 (約 0.5 秒) │ ├─────────────────────────────────────────────────────────────────┤ │ 步驟 3: 恢復(fù)完成 │ │ - 總耗時(shí)約 2.5 秒 │ │ - 數(shù)據(jù)丟失:僅 T5 時(shí)刻未 fsync 的少量數(shù)據(jù) │ └─────────────────────────────────────────────────────────────────┘ ? 對(duì)比純 RDB 恢復(fù): - 恢復(fù)時(shí)間:約 2 秒 - 數(shù)據(jù)丟失:T2-T5 期間所有寫(xiě)操作(可能幾小時(shí)數(shù)據(jù)) ? 對(duì)比純 AOF 恢復(fù): - 恢復(fù)時(shí)間:約 30 秒+(重放所有命令) - 數(shù)據(jù)丟失:僅 T5 時(shí)刻未 fsync 的少量數(shù)據(jù)
七、最佳實(shí)踐總結(jié)
| 場(chǎng)景 | 推薦配置 | 理由 |
|---|---|---|
| 生產(chǎn)環(huán)境 | RDB+AOF 混合持久化 | 性能與安全最佳平衡 |
| 高寫(xiě)入場(chǎng)景 | appendfsync everysec | 每秒同步,性能影響小 |
| 金融級(jí)數(shù)據(jù) | appendfsync always | 不丟數(shù)據(jù),接受性能損失 |
| 純緩存場(chǎng)景 | 可關(guān)閉持久化 | 追求極致性能 |
| Redis 版本 | 4.0+ | 支持混合持久化 |
監(jiān)控建議
# 檢查持久化狀態(tài) redis-cli INFO persistence ? # 關(guān)鍵指標(biāo): # - rdb_last_bgsave_status: RDB 最后保存狀態(tài) # - aof_enabled: AOF 是否開(kāi)啟 # - aof_last_rewrite_time_sec: AOF 最后重寫(xiě)耗時(shí) # - aof_current_size: AOF 當(dāng)前文件大小
八、總結(jié)
| 問(wèn)題 | 答案 |
|---|---|
| RDB 和 AOF 能同時(shí)開(kāi)嗎? | 可以,且生產(chǎn)環(huán)境推薦同時(shí)開(kāi)啟 |
| 恢復(fù)時(shí)優(yōu)先用哪個(gè)? | AOF 優(yōu)先級(jí)更高(數(shù)據(jù)更完整) |
| 混合持久化是什么? | AOF 文件頭部存 RDB 快照,尾部存增量命令 |
| 需要配置什么? | aof-use-rdb-preamble yes(4.0+ 默認(rèn)開(kāi)啟) |
| 最佳實(shí)踐? | Redis 4.0+ 使用混合持久化 + appendfsync everysec |
| Redis 4.0+ 有幾個(gè)持久化文件? | 兩個(gè):dump.rdb + appendonly.aof |
| Redis 4.0+ appendonly.aof 內(nèi)容是什么? | RDB 快照前綴 + AOF 增量命令 |
| Redis 4.0+ dump.rdb 還會(huì)生成嗎? | 會(huì),只要 save 配置生效 |
| Redis 4.0+ dump.rdb 有什么用? | 備份、降級(jí)兼容、手動(dòng)恢復(fù) |
| Redis 4.0+ 能刪除 dump.rdb 嗎? | 可以,但不推薦(失去備份) |
| Redis 4.0+ 如何只保留一個(gè)文件? | 配置 save "" 禁用 RDB(不推薦) |
| Redis 版本 | 持久化模式 | dump.rdb | appendonly.aof | 恢復(fù)時(shí)使用哪個(gè) |
|---|---|---|---|---|
| 4.0 之前 | 僅 RDB | ? 存在 | ? 不存在 | RDB |
| 4.0 之前 | 僅 AOF | ? 不存在 | ? 存在 | AOF |
| 4.0 之前 | RDB+AOF | ? 存在 | ? 存在 | AOF(優(yōu)先) |
| 4.0+ | 混合持久化 | ? 存在 | ? 存在 | AOF(含 RDB 前綴) |
核心要點(diǎn):
- Redis 4.0+ 的混合持久化是生產(chǎn)環(huán)境的標(biāo)準(zhǔn)配置,它巧妙地將 RDB 的快速恢復(fù)和 AOF 的數(shù)據(jù)完整性結(jié)合起來(lái),通過(guò)單一的 AOF 文件同時(shí)存儲(chǔ)快照和增量日志,實(shí)現(xiàn)了性能和安全的最優(yōu)平衡。
- Redis 4.0+ 混合持久化后,dump.rdb 和 appendonly.aof 兩個(gè)文件都會(huì)存在。dump.rdb 雖然恢復(fù)時(shí)不用,但仍然作為獨(dú)立備份存在,提供降級(jí)兼容和冷備能力。appendonly.aof 才是真正用于恢復(fù)的主文件(包含 RDB 快照 + 增量命令)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis中的String類型及使用Redis解決訂單秒殺超賣問(wèn)題
這篇文章主要介紹了Redis中的String類型及使用Redis解決訂單秒殺超賣問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Redis高并發(fā)緩存設(shè)計(jì)問(wèn)題與性能優(yōu)化
本文詳細(xì)介紹了Redis緩存設(shè)計(jì)中常見(jiàn)的問(wèn)題及解決方案,包括緩存穿透、緩存失效(擊穿)、緩存雪崩、熱點(diǎn)緩存key重建優(yōu)化、緩存與數(shù)據(jù)庫(kù)雙寫(xiě)不一致以及開(kāi)發(fā)規(guī)范與性能優(yōu)化,感興趣的可以了解一下2024-11-11
Redis實(shí)現(xiàn)延遲任務(wù)的常見(jiàn)方案詳解
延遲任務(wù)(Delayed?Task)是指在未來(lái)的某個(gè)時(shí)間點(diǎn),執(zhí)行相應(yīng)的任務(wù),本文為大家整理了Redis實(shí)現(xiàn)延遲任務(wù)的幾個(gè)常見(jiàn)方案,希望對(duì)大家有所幫助2024-04-04

