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。