Redis提供了一種將數據持久化到磁碟的方式,即AOF (Append-Only File)。但隨著時間的推移,AOF文件的大小不斷增長,可能會導致性能下降和磁碟空間問題。為了解決這個問題,Redis提供了AOF Rewrite (重寫, 壓縮)功能。在這篇文章中,我們將詳細了解AOF Rewrite是什麼、如何運作以及如何設置。


1. AOF(Append-Only File)是什麼?為什麼需要重寫?

Redis使用AOF文件來持久化數據,通過按順序記錄所有寫入操作。例如,每當執行SET key value命令時,該命令都會被記錄到AOF文件中。這樣,即使Redis服務器重新啟動,我們仍然可以恢復數據。

然而,隨著時間的推移,對相同鍵的重複命令不斷增加,AOF文件變得越來越大,恢復所需的時間也會變長,這是一個問題。

為了解決這個問題,提供了AOF Rewrite (壓縮及清理)功能


2. AOF Rewrite是什麼?

Redis AOF Rewrite Infographic

AOF Rewrite是將現有的appendonly.aof文件進行替換成優化的新文件的過程。這一過程會保持原有AOF文件不變,同時生成新的文件,刪除不必要的命令以減小其大小。這裡的重要概念是在優化後替換原有文件,這一點總結了重寫的工作方式。

📌 AOF Rewrite的運作方式

  1. Redis不會直接修改現有的AOF文件,而是生成一個新的AOF文件。
  2. 新文件中只包含反映最新狀態的最小命令
  3. 例如,假設現有的AOF文件如以下所示:
   SET key1 "hello"
   SET key1 "world"
   SET key1 "final"

在AOF Rewrite之後,將會優化為:

SET key1 "final"

也就是說,當新的appendonly.aof.tmp文件完成後,舊文件將被刪除並用新文件替代。(tmp文件替換了aof文件。)


3. AOF Rewrite的設置方法

✅ 自動AOF Rewrite設置

Redis可以被設置為自動執行AOF Rewrite。在redis.conf中進行如下設置:

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
  • auto-aof-rewrite-percentage 100: 上次AOF Rewrite後檔案大小提高100% (2倍)以上時執行重寫
  • auto-aof-rewrite-min-size 64mb: 僅當AOF文件大小至少為64MB時才執行重寫

也就是說,如果現有AOF文件大小為50MB,之後增至100MB,那麼將會自動執行重寫。

這兩個選項最好總是一起設置。如果未指定auto-aof-rewrite-min-size值,當之前的AOF文件大小為20MB時,文件增長到40MB的瞬間就可能會發生不必要的重寫。因此通過設置auto-aof-rewrite-min-size可以確保只有達到一定大小後才會執行重寫。

即,如果現有的AOF文件大小為50MB,然後增至100MB時,將會自動執行重寫。

✅ 手動執行AOF Rewrite

執行以下命令將使Redis立即進行AOF Rewrite。

redis-cli BGREWRITEAOF

執行此命令會使Redis在後台生成新的AOF文件,並自動進行替換過程。


4. AOF Rewrite的結果

當執行AOF Rewrite後,Redis的數據目錄(如/var/lib/redis等)將生成如下文件。

ls /var/lib/redis

示例輸出:

appendonly.aof
appendonly.aof.tmp  # 重寫期間生成的臨時文件
  • appendonly.aof.tmp: 在AOF Rewrite過程中生成的新優化AOF文件。
  • appendonly.aof: 重寫完成後,刪除舊文件並用新文件替換。

🚨 AOF Rewrite不是壓縮現有AOF文件,而是生成新的AOF文件並替換原有文件的方式。


5. 何時使用AOF Rewrite?

當AOF文件大小過大,佔用過多磁碟空間時 - Redis持續記錄數據,隨著時間的推移,文件大小會不斷增長。 - 通過清理不必要的命令來減少磁碟使用量。

當希望在Redis重啟時加快恢復速度時 - 如果AOF文件過大,Redis在重啟時需要執行所有命令來恢復數據,將會花費較長時間。 - 通過執行AOF Rewrite可減少文件大小,從而加快恢復速度。

當希望優化Redis性能時 - 如果AOF文件過大,會導致Redis性能下降。 - 定期執行AOF Rewrite,可以使Redis運行得更加穩定。


6. RDB快照與AOF Rewrite的區別

比較項目 AOF (Append-Only File) RDB (Redis Database)
保存方式 記錄所有寫入操作 定時將所有數據轉存
恢復速度 慢(需要執行所有命令) 快(使用二進制快照恢復)
數據丟失可能性 低(依賴fsync設置) 有(依賴快照間隔)
文件大小 大(記錄所有操作) 小(僅保存最新狀態)
性能影響 高(記錄所有操作到日誌) 低(定期執行轉存)
適合用途 需要高耐久性的情況 需要快速恢復的情況

👉 在Redis運行環境中,通常會同時設置AOF + RDB,以確保最佳的性能和穩定性。


7. 結論與總結

  • Redis的AOF Rewrite是為了縮小AOF文件大小並提升恢復速度
  • 它不會直接修改原有AOF文件,而是通過生成新的優化AOF文件來替換舊文件
  • 適當設置auto-aof-rewrite-percentageauto-aof-rewrite-min-size,可以自動執行AOF Rewrite,以有效管理性能和存儲空間
  • 與RDB快照一起使用,可以同時優化Redis的耐久性和性能

📌 在運行Redis時,合理利用AOF Rewrite來優化性能! 🚀

在右側的搜索框中搜索redis,可以找到更多有關redis設置的文章。

如果需要整理RDBAOF的概念,建議您查看以下文章。

Redis 第二篇:Redis的數據保護選項 - RDB vs AOF