1. 程式人生 > >redis之五 持久化機制(AOF和RDB)

redis之五 持久化機制(AOF和RDB)

redis中文官網:redis持久化

redis支援兩種持久化方式:RDB方式和AOF方式

一、RDB方式

在預設情況下,Redis將資料庫快照儲存在名字為dump.rdb的二進位制檔案中。你可以對Redis進行設定,讓它在“N秒內資料集至少有M個改動”這一條件被滿足時,自動儲存一次資料集。你也可以通過呼叫SAVE或者BGSAVE,手動讓Redis進行資料集儲存操作。

save 60 1000   //60秒內有至少有1000個鍵被改動時,自動儲存一次資料集

DRB工作原理
當 Redis 需要儲存 dump.rdb 檔案時, 伺服器執行以下操作:

  • Redis 呼叫forks. 同時擁有父程序和子程序。
  • 子程序將資料集寫入到一個臨時 RDB 檔案中。
  • 當子程序完成對新 RDB 檔案的寫入時,Redis用新RDB檔案替換原來的RDB檔案,並刪除舊的 RDB 檔案。

RDB在儲存RDB檔案時父程序唯一需要做的就是fork出一個子程序,接下來的工作全部由子程序來做,父程序不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的效能。這種工作方式使得 Redis 可以從寫時複製(copy-on-write)機制中獲益。

二、AOF方式(Append-only file)

Redis預設沒有開啟AOF方式的持久化,可以通過appendonly引數開啟。

appendonly yes

開啟AOF持久化後每執行一條更改Redis中的資料的命令,Redis就會將改命令寫入到硬碟的AOF檔案中。AOF檔案的儲存位置與RDB檔案的儲存位置相同,都是可以通過dir引數設定的,預設的檔名是appendonly.conf,可以通過appendfilename引數修改:

appendfilename appendonly.aof

預設情況下系統每30秒回執行一次同步操作,以便將硬碟快取中的內容真正地寫入硬碟,在這30秒的過程中如果系統異常退出則會導致硬碟快取中的資料丟失。

AOF工作原理
AOF 重寫和 RDB 建立快照一樣,都巧妙地利用了寫時複製機制:

  • Redis fork出一個子程序。
  • 子程序開始將新AOF檔案的內容寫入到臨時檔案。
  • 對於所有新執行的寫入命令,父程序一邊將它們累積到一個記憶體快取中,一邊將這些改動追加到現有 AOF檔案的末尾,這樣即使在重寫的中途發生停機,現有的 AOF 檔案也還是安全的。
  • 當子程序完成重寫工作時,它給父程序傳送一個訊號,父程序在接收到訊號之後,將記憶體快取中的所有資料追加到新 AOF 檔案的末尾。
  • 搞定!現在 Redis 原子地用新檔案替換舊檔案,之後所有命令都會直接追加到新 AOF 檔案的末尾。

三、如何選擇使用哪種持久化方式?

如果可以承受數分鐘以內的資料丟失,那麼可以只使用 RDB 持久化。

官方並不推薦只使用AOF持久化這種方式:因為定時生成RDB快照(snapshot)非常便於進行資料庫備份, 並且RDB恢復資料集的速度也要比 AOF 恢復的速度要快, 除此之外,使用 RDB 還可以避免之前提到的AOF程式的bug。