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

