redis提供了兩種資料持久化的方式,分別是RDB(Redis DataBase)和AOF(Apend Only File)。
RDB方式
RDB方式是一種快照式的持久化方法,將某一時刻的數據持久化到磁碟中。 (推薦學習:Redis影片教學)
redis在進行資料持久化的過程中,會先將資料寫入到一個暫存檔案中,待持久化過程都結束了,才會用這個臨時檔案取代上次持久化好的檔案。正是這種特性,讓我們可以隨時來進行備份,因為快照檔案總是完整可用的。
對於RDB方式,redis會單獨建立(fork)一個子進程來進行持久化,而主進程是不會進行任何IO操作的,這樣就確保了redis極高的效能。
如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那麼RDB方式要比AOF方式更加的高效。
AOF方式
AOF方式是將執行過的寫入指令記錄下來,在資料復原時依照叢前到後的順序再將指令執行一遍。
AOF指令以redis協定追加將每次寫寫的動作儲存到檔案結尾。 Redis還能對AOF檔進行後台重寫,使得AOF檔的體積不會過大。
預設的AOF持久化策略是每秒鐘fsync一次(fsync是指把快取中的寫入指令記錄到磁碟中),因為在這種情況下,redis仍然可以保持良好的處理效能,即使redis故障,也只會遺失最近1秒鐘的資料。
如果在追加日誌時,恰好遇到磁碟空間滿、inode滿或斷電等情況導致日誌寫入不完整,也沒有關係,redis提供了redis-check-aof工具,可以用來進行日誌修復。
因為採用了追加方式,如果不做任何處理的話,AOF檔會變得越來越大,為此,redis提供了AOF檔重寫(rewrite)機制,即當AOF檔的大小超過設定的閾值時,redis就會啟動AOF檔案的內容壓縮,只保留可以恢復資料的最小指令集。
舉例或許更形象,假如我們調用了100次INCR指令,在AOF檔中就要儲存100條指令,但這明顯是很低效的,完全可以把這100條指令合併成一條SET指令,這就是重寫機制的原理。
在進行AOF重寫時,仍然是採用先寫臨時文件,全部完成後再替換的流程,所以斷電、磁碟滿等問題都不會影響AOF文件的可用性。
更多Redis相關技術文章,請造訪Redis入門教學欄位學習!
以上是redis如何做資料持久化的詳細內容。更多資訊請關注PHP中文網其他相關文章!