快轉到主要內容
  1. Core/

Redis persistence|RDB vs. AOF 深度解析

Idle Engineer
作者
Idle Engineer
AI Runs. I Nap. | 404 Career Not Found
目錄

TL;DR | 面試情境模擬
#

👴 面試官:請詳細比較 Redis 的 RDB 和 AOF 機制,並說明其差異。

🧑‍💻 :RDB 通過 fork 子行程進行快照,體積小且恢復快,適合冷備份;AOF 則是追加寫入命令日誌,數據完整性高,但體積大。現代生產環境多採用兩者共用的 Hybrid 模式。


為什麼要persistence?(比喻理解)
#

如果 Redis 服務掛了,記憶體裡的資料就全沒了。為了救回這些資料,我們有兩種備份方式:

1. RDB (Redis Database) —— 攝影機快照
#

想像每小時用攝影機拍一張餐廳營業全景圖。

  • 優點:一張照片幾秒鐘看完,恢復時直接重現快照,速度極快。
  • 缺點:如果攝影機是一小時拍一次,那故障時刻前的那一小時內發生的事情全沒了。

2. AOF (Append Only File) —— 流水帳錄音筆
#

給員工一台錄音筆,記錄他做的每一道菜、每一筆交易。

  • 優點:只要有錄音在,無論何時故障,我都能重播這捲錄音帶把所有動作補齊,資料極度完整。
  • 缺點:錄音帶越記越長,檔案變巨大;重播(恢復)時,因為要重走一遍所有步驟,速度比較慢。

💡 深入技術解析
#

1. RDB (Redis Database)
#

在指定時間間隔內,對資料集進行快照 (Snapshot) 並儲存為二進位檔案 (dump.rdb)。

運作圖解:

[記憶體 Memory]                [硬碟 Disk]
    |------------------快照---------------> [ dump.rdb ]
    | (Fork 子行程)
    |------------------快照---------------> [ dump.rdb ]
  • 機制:Redis 會 fork() 一個子行程,利用 Copy-on-Write (COW) 機制,讓子行程將當時的記憶體狀態寫入硬碟,主行程繼續處理請求,這確保了 Redis 不會因快照而阻塞。

2. AOF (Append Only File)
#

以純文字格式追加記錄 Redis 接收到的每一條寫入指令。

運作圖解:

[Redis 主程序] --(寫入指令)--> [appendonly.aof]
           |--(寫入指令)--> [appendonly.aof]
           |--(寫入指令)--> [appendonly.aof]
  • AOF Rewrite (重寫) 機制
[AOF 檔案 - 臃腫]                [AOF 檔案 - 精簡]
  SET k1 1                       
  SET k1 2   ----(Rewrite)--->   SET k1 2
  DEL k1
  SET k2 3                       SET k2 3

💡 Hybrid 模式:RDB 與 AOF 的最佳搭檔
#

現代生產環境通常會同時啟用 RDB 與 AOF,達成「資料安全性」與「恢復速度」的平衡。

運作圖解:

[客戶端請求]
      |
      V
[Redis 主程序]
  /        \
 /          \
V            V
(AOF)        (RDB)
  |            |
  V            V
[appendonly.aof]  [dump.rdb]
 (記錄即時變化)     (定期備份全貌)

為什麼這樣配合最完美?

  • 日常運作:Redis 每一條寫入指令都寫入 AOF (保證安全);後台定時觸發 RDB 快照 (保證備份狀態)。
  • 重啟恢復:Redis 會優先使用 RDB 加載基礎資料狀態 (快速),再重放自上次快照後的 AOF 記錄 (補齊細節)。

核心差異總結
#

特性 RDB AOF
數據完整性 較低 (可能丟失間隔內數據) 極高 (最多丟失 1 秒數據)
文件大小 小 (壓縮過的二進位) 大 (純文字指令記錄)
恢復速度
系統負載 Fork 子行程時有開銷 頻繁寫入指令有開銷

💡 進階補充:常見追問
#

Q1:AOF Rewrite (重寫) 會阻塞主線程嗎?
#

不會。AOF 重寫會在後台子行程中進行,主行程依然正常處理請求。重寫完成後,主行程會將重寫期間產生的新變更同步到新的 AOF 檔案中。