Redis的持久化機制

定時快照方式(snapshot):

該持久化方式實際是在Redis內部一個定時器事件,每隔固定時間去檢查當前數據發生的改變次數與時間是否滿足配置的持久化觸發的條件,如果滿足則通過操作系統fork調用來創建出一個子進程,這個子進程默認會與父進程共享相同的地址空間,這時就可以通過子進程來遍歷整個內存來進行存儲操作,而主進程則仍然可以提供服務,當有寫入時由操作系統按照內存頁(page)爲單位來進行copy-on-write保證父子進程之間不會互相影響。

該持久化的主要缺點是定時快照只是代表一段時間內的內存映像,所以系統重啓會丟失上次快照與重啓之間所有的數據。

基於語句追加方式(aof):

aof方式實際類似mysql的基於語句的binlog方式,即每條會使Redis內存數據發生改變的命令都會追加到一個log文件中,也就是說這個log文件就是Redis的持久化數據。

aof的方式的主要缺點是追加log文件可能導致體積過大,當系統重啓恢復數據時如果是aof的方式則加載數據會非常慢,幾十G的數據可能需要幾小 時才能加載完,當然這個耗時並不是因爲磁盤文件讀取速度慢,而是由於讀取的所有命令都要在內存中執行一遍。另外由於每條命令都要寫log,所以使用aof 的方式,Redis的讀寫性能也會有所下降。

虛擬內存方式:

虛擬內存方式是Redis來進行用戶空間的數據換入換出的一個策略,此種方式在實現的效果上比較差,主要問題是代碼複雜,重啓慢,複製慢等等.

diskstore方式

diskstore方式是作者放棄了虛擬內存方式後選擇的一種新的實現方式,也就是傳統的B-tree的方式,目前仍在實驗階段,後續是否可用我們可以拭目以待。

持久化機制的選擇

  當業務不需要數據持久化時,當然關閉所有的持久化方式可以獲得最佳的性能以及最大內存的使用量;如果需要使用持久化,根據是否可以容忍重啓丟失部分數據在快照方式與語句追加方式之間選擇其一,不要使用虛擬內存以及diskstore方式。目前來說,個人覺得選擇aof的方式是最佳的選擇。

  難以取捨的持久化機制主要是快照和aof方式。相比於aof快照的特點是速度快,恢復的速度也快。但是宕機的時候丟失的數據相對多一點。

當aof和快照同時開啓的時候。

數據恢復時會首先使用 aof的文件來恢復,恢復失敗的時候再去考慮快照。

發佈了41 篇原創文章 · 獲贊 50 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章