天天看點

redis之持久化機制

Redis 為什麼要持久化?

Redis 中的資料類型都支援 push/pop、add/remove 及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis 支援各種不同方式的排序。與 Memcached 一樣,為了保證效率,資料都是緩存在記憶體中。

對,資料都是緩存在記憶體中的,當你重新開機系統或者關閉系統後,緩存在記憶體中的資料都會消失殆盡,再也找不回來了。是以,為了讓資料能夠長期儲存,就要将 Redis 放在緩存中的資料做持久化存儲。

Redis 怎麼實作持久化?

在設計之初,Redis 就已經考慮到了這個問題。官方提供了多種不同級别的資料持久化的方式:

1、RDB持久化方式能夠在指定的時間間隔能對你的資料進行快照存儲。

2、AOF持久化方式記錄每次對伺服器寫的操作,當伺服器重新開機的時候會重新執行這些指令來恢複原始的資料,AOF指令以redis協定追加儲存每次寫的操作到檔案末尾.Redis還能對AOF檔案進行背景重寫,使得AOF檔案的體積不至于過大。

3、如果你隻希望你的資料在伺服器運作的時候存在,你也可以不使用任何持久化方式。

4、你也可以同時開啟兩種持久化方式, 在這種情況下, 當redis重新開機的時候會優先載入AOF檔案來恢複原始的資料,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整。

如果你不知道該選擇哪一個級别的持久化方式,那我們就先來了解一下 AOF 方式和 RDB 方式有什麼樣的差別,并且它們各自有何優劣,學習完之後,再來考慮該選擇哪一種級别。

RDB 方式與 AOF 方式的優勢對比

首先我們來看一看官方對于兩種方式的優點描述,并做個對比,然後再看一看兩種方式的缺點描述。

RDB 方式的優點

RDB 是一個非常緊湊的檔案,它儲存了某個時間點的資料集,非常适用于資料集的備份,比如你可以在每個小時報儲存一下過去24小時内的資料,同時每天儲存過去30天的資料,這樣即使出了問題你也可以根據需求恢複到不同版本的資料集。

RDB 是一個緊湊的單一檔案,很友善傳送到另一個遠端資料中心,非常适用于災難恢複。

RDB 在儲存 RDB 檔案時父程序唯一需要做的就是 fork 出一個子程序,接下來的工作全部由子程序來做,父程序不需要再做其他 IO 操作,是以 RDB 持久化方式可以最大化 Redis 的性能。

與AOF相比,在恢複大的資料集的時候,RDB 方式會更快一些。

當 Redis 需要儲存

dump.rdb

檔案時, 伺服器執行以下操作:

Redis 調用forks. 同時擁有父程序和子程序。

子程序将資料集寫入到一個臨時 RDB 檔案中。

當子程序完成對新 RDB 檔案的寫入時,Redis 用新 RDB 檔案替換原來的 RDB 檔案,并删除舊的 RDB 檔案。

這種工作方式使得 Redis 可以從寫時複制(

copy-on-write

)機制中獲益。

AOF 方式的優點

使用AOF 會讓你的Redis更加耐久:

你可以使用不同的 fsync 政策:無 fsync、每秒 fsync 、每次寫的時候 fsync .使用預設的每秒 fsync 政策, Redis 的性能依然很好( fsync 是由背景線程進行處理的,主線程會盡力處理用戶端請求),一旦出現故障,你最多丢失1秒的資料。

AOF檔案是一個隻進行追加的日志檔案,是以不需要寫入seek,即使由于某些原因(磁盤空間已滿,寫的過程中當機等等)未執行完整的寫入指令,你也也可使用redis-check-aof工具修複這些問題。

Redis 可以在 AOF 檔案體積變得過大時,自動地在背景對 AOF 進行重寫: 重寫後的新 AOF 檔案包含了恢複目前資料集所需的最小指令集合。 整個重寫操作是絕對安全的,因為 Redis 在建立新 AOF 檔案的過程中,會繼續将指令追加到現有的 AOF 檔案裡面,即使重寫過程中發生停機,現有的 AOF 檔案也不會丢失。 而一旦新 AOF 檔案建立完畢,Redis 就會從舊 AOF 檔案切換到新 AOF 檔案,并開始對新 AOF 檔案進行追加操作。

AOF 檔案有序地儲存了對資料庫執行的所有寫入操作, 這些寫入操作以 Redis 協定的格式儲存, 是以 AOF 檔案的内容非常容易被人讀懂, 對檔案進行分析(

parse

)也很輕松。 導出(

export

) AOF 檔案也非常簡單: 舉個例子, 如果你不小心執行了 FLUSHALL 指令, 但隻要 AOF 檔案未被重寫, 那麼隻要停止伺服器, 移除 AOF 檔案末尾的 FLUSHALL 指令, 并重新開機 Redis , 就可以将資料集恢複到 FLUSHALL 執行之前的狀态。

優點對比總結

RDB 方式可以儲存過去一段時間内的資料,并且儲存結果是一個單一的檔案,可以将檔案備份到其他伺服器,并且在回複大量資料的時候,RDB 方式的速度會比 AOF 方式的回複速度要快。

AOF 方式預設每秒鐘備份1次,頻率很高,它的操作方式是以追加的方式記錄日志而不是資料,并且它的重寫過程是按順序進行追加,是以它的檔案内容非常容易讀懂。可以在某些需要的時候打開 AOF 檔案對其編輯,增加或删除某些記錄,最後再執行恢複操作。