Redis之(五)持久化

2021-09-24 21:43:31 字數 2210 閱讀 5047

redis提供了兩種持久化的方式:

(1)rdbredis database)模式,就是在不同的時間點,將redis儲存的資料生成快照並儲存到磁碟等介質上;

(2)aofappendonlyfile)模式,則換了乙個角度來實現持久化,那就是將redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,只要把這些寫指令從前到後再重複執行一遍,就可以實現資料恢復了。

rdb和aof兩種方式可以同時使用,在這種情況下如果redis重啟,則會優先採用aof方式來進行資料恢復,這是因為aof方式的資料恢復完整度更高。

沒有資料持久化的需求,也完全可以關閉rdb和aof方式,這樣的話,redis將變成乙個純記憶體資料庫,就像memcache一樣。

redis在進行資料持久化的過程中,會先將資料寫入到乙個臨時檔案中,待持久化過程都結束了,才會用這個臨時檔案替換上次持久化好的檔案。正是這種特性,讓我們可以隨時來進行備份,因為快照檔案總是完整可用的。

對於rdb方式,redis會單獨建立(fork)乙個子程序來進行持久化,而主程序是不會進行任何io操作的,這樣就確保了redis極高的效能。

如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那rdb方式要比aof方式更加的高效。

雖然rdb有不少優點,但它的缺點也是不容忽視的。如果對資料的完整性非常敏感,那麼rdb方式就不太適合,因為即使每5分鐘都持久化一次,當redis故障時,仍然會有近5分鐘的資料丟失。所以,redis還提供了另一種持久化方式,那就是aof。

預設的aof持久化策略是每秒鐘fsync一次(fsync是指把快取中的寫指令記錄到磁碟中),因為在這種情況下,redis仍然可以保持很好的處理效能,即使redis故障,也只會丟失最近1秒鐘的資料。

如果在追加日誌時,恰好遇到磁碟空間滿、inode滿或斷電等情況導致日誌寫入不完整,也沒有關係,redis提供了redis-check-aof工具,可以用來進行日誌修復。

aof 後台執行的方式和 rdb 有類似的地方,fork 乙個子程序,主程序仍進行服務,子程序執行 aof 持久化,資料被 dump 到磁碟上。與 rdb 不同的是,後台子程序持久化過程中,主程序會記錄期間的所有資料變更(主程序還在服務),並儲存在 server.aof_rewrite_buf_blocks 中;後台子程序結束後,redis更新快取追加到 aof 檔案中,是 rdb 持久化所不具備的。

因為採用了追加方式,如果不做任何處理的話,aof檔案會變得越來越大,為此,redis提供了aof檔案重寫(rewrite)機制,即當aof檔案的大小超過所設定的閾值時,redis就會啟動aof檔案的內容壓縮,只保留可以恢復資料的最小指令集。舉個例子或許更形象,假如我們呼叫了100次incr指令,在aof檔案中就要儲存100條指令,但這明顯是很低效的,完全可以把這100條指令合併成一條set指令,這就是重寫機制的原理。在進行aof重寫時,仍然是採用先寫臨時檔案,全部完成後再替換的流程,所以斷電、磁碟滿等問題都不會影響aof檔案的可用性。

aof重寫的內部執行原理,有必要了解一下。

在重寫即將開始之際,redis會建立(fork)乙個「重寫子程序」,這個子程序會首先讀取現有的aof檔案,並將其包含的指令進行分析壓縮並寫入到乙個臨時檔案中。

與此同時,主工作程序會將新接收到的寫指令一邊累積到記憶體緩衝區中,一邊繼續寫入到原有的aof檔案中,這樣做是保證原有的aof檔案的可用性,避免在重寫過程**現意外。

當「重寫子程序」完成重寫工作後,它會給父程序發乙個訊號,父程序收到訊號後就會將記憶體中快取的寫指令追加到新aof檔案中。

當追加結束後,redis就會用新aof檔案來代替舊aof檔案,之後再有新的寫指令,就都會追加到新的aof檔案中了。

雖然優點多多,但aof方式也同樣存在缺陷,比如在同樣資料規模的情況下,aof檔案要比rdb檔案的體積大。而且,aof方式的恢復速度也要慢於rdb方式。

如果運氣比較差,aof檔案出現了被寫壞的情況,也不必過分擔憂,redis並不會貿然載入這個有問題的aof檔案,而是報錯退出。這時可以通過redis-check-aof工具來修復檔案,確認問題點後再重啟redis。

redis 五 Redis持久化之aof

前言 1 官網介紹 以下內容為有道詞典翻譯 aof的優勢 使用aof redis更加持久 您可以使用不同的fsync策略 完全沒有fsync,每秒fsync,每個查詢fsync。使用預設策略fsync時,每秒的寫入效能仍然很好 fsync是使用後台執行緒執行的,並且在沒有進行fsync的情況下,主線...

Redis學習 五 Redis持久化

redis是乙個記憶體資料庫,那麼如果不做持久化的話,當redis伺服器守護程序退出,伺服器宕機,計算機斷電 就會導致記憶體中的資料丟失,如果redis只是作為乙個快取伺服器來用的話,那麼不會有什麼影響,但是如果作為乙個記憶體資料庫的話,當上面的情況發生就會出現丟失所有資料的重大事故 rdb red...

Redis系列五 Redis持久化

一 rdb redis database 1 介紹 在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,也就是行話講的snapshot快照,它恢復時是將快照檔案直接讀到記憶體裡。redis會單獨建立 fork 乙個子程序來進行持久化,會先將資料寫入到乙個臨時檔案中,待持久化過程都結束了,再用這個臨時檔...