1. 程式人生 > 實用技巧 >Redis 之 RDB 和AOF兩種機制

Redis 之 RDB 和AOF兩種機制

redis提供兩種持久化策略 rdb 和 aof

rdb:redis database

  • rdb持久化方式能夠在指定的時間間隔中對你的資料進行快照儲存。
  • 在預設情況下,redis將資料庫快照儲存在名字為dump.rdb二進位制檔案中。
  • 在redis執行時,rdb程式將當前記憶體中的資料庫快照儲存到磁碟檔案中,在redis重新啟動時,rob程式可以通過載入rdb檔案來還原資料庫的狀態。

工作方式
當redis需要儲存dump.rdb檔案時。伺服器執行以下操作:

  1. redis呼叫forks。同時擁有父程序和子程序。
  2. 子程序將資料集寫入到一個臨時rdb檔案中。
  3. 當子程序完成對新rdb檔案的寫入時,redis用新rdb檔案替換原來的rdb檔案,並刪除舊的rdb檔案。
    這種工作方式使得redis可以從寫時複製(copy-on-write)機制中獲益。

即 redis會單獨建立(fork)一個子程序來進行持久化,會先將資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個臨時檔案替換上次持久化好的檔案。整個過程中,主程序時不進行任何IO操作的,這就確保了極高的效能。如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那rdb方式要比aof方式更加高效。rdb缺點時最後依次持久化的資料可能丟失。

redis的配置檔案中已經配置的有檔案備份的設定。
在這裡插入圖片描述
在這裡插入圖片描述

滿足上面三個條件之一,那麼會觸發後臺操作,在硬碟中生成一個dump.rdb檔案,臨時儲存檔案。

關機後,redis中的所有資料消失。redis重啟後,會自動讀取dump.rdb檔案,把rdb中的所有資料讀入到記憶體。

執行命令時,可直接save,立即生成到dump.rdb檔案中做備份。

rdb缺點:宕機時候有可能會損失一個時間片的資料。
例如:每隔2分鐘做一個備份,有可能剛要備份 宕機了,則損失2分鐘的資料。即後2分鐘資料沒有備份到rdb中。


aof :append only file

  • aof:redis預設不開啟。它的出現是為了彌補rdb的不足(資料的不一致性),所以它採用日誌的形式來記錄每個寫操作,並追加到檔案中。redis重啟的時候會根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作。

需要去開啟
進入到redis.conf檔案中,找到 APPEND ONLY MODE
將no改為yes,然後重啟會發現appendonly.aof檔案
在這裡插入圖片描述
在這裡插入圖片描述
那麼,為了驗證aof檔案起作用,可以刪除rdb檔案。
也可不刪,aof和rdb可同時存在,但是啟動時候先找的是aof檔案。

執行操作:
執行操作 set 然後 檢視aof檔案,會記錄命令
在這裡插入圖片描述
但是此時 客戶端中沒有資料,因為flushall命令,要把此命令刪除掉,進入aof刪除flushall命令即可
在這裡插入圖片描述
重啟redis,檢視到有資料,因為flushall是清空快取
在這裡插入圖片描述
那麼,還有一個就是修復aof檔案,例如手動修改aof 隨意新增內容
在這裡插入圖片描述
執行 src/redis-check-aof --fix appendonly.aof 命令
在這裡插入圖片描述
aof檔案採用檔案追加的形式,檔案會越來越大,為了避免出現這種情況,新增了重寫機制,當aof檔案超過設定的閾值的時候,redis就會啟用aof檔案的內容壓縮,只保留可以恢復資料的最小指令,可以使用bgrewriteaof
redis會記錄上次重寫的時候的aof大小,預設配置是當aof檔案大小是上次rewrite後大小的一倍且檔案大於64MB的時候觸發。


總結:

  • redis預設開啟rdb持久化方式,在指定的時間間隔內,執行指定次數的寫操作,則將記憶體中的資料寫入到磁碟中。因為查操作 不影響資料庫中資料。

  • rdb持久化適合大規模的資料恢復但它的資料一致性和完整性較差。

  • redis需要手動開啟aof持久化方式,預設是每秒將寫操作日誌追加到aof檔案中。

  • aof的資料完整性比rdb高,但記錄內容多了,會影響資料恢復的效率。

  • redis針對aof檔案大的問題,提供重寫的瘦身機制。

  • 若只打算用redis做快取,可以關閉持久化。

  • 若打算使用redis的持久化,建議rdb和aof都開啟。其實rdb更適合做資料的備份,留一後手,aof出問題時,還有rdb。