1. 程式人生 > >Redis持久化-RDB與AOF

Redis持久化-RDB與AOF

RDB:Redis Data Base

是什麼

  1. 在指定的時間間隔內將記憶體中的資料集快照寫入磁碟,它恢復時是將快照檔案直接讀到記憶體裡
  2. Redis會單獨建立(fork)一個子程序來進行持久化,會先將資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個臨時檔案替換上次持久化好的檔案。整個過程中,主程序是不進行任何IO操作的,這就確保了極高的效能如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的資料可能丟失。整個過程中,主程序是不進行任何IO操作的,這就確保了極高的效能如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的資料可能丟失。
  3. fork的作用是複製一個與當前程序一樣的程序。新程序的所有資料(變數、環境變數、程式計數器等)數值都和原程序一致,但是是一個全新的程序,並作為原程序的子程序。因此極為消耗資源

備份發生在什麼時候

當我們執行flushall指令或者shutdown時,資料庫會自動進行備份

備份到哪

備份的位置在redis.conf配置檔案中進行配置
在這裡插入圖片描述
在這裡插入圖片描述

怎麼備份

備份的方式有兩種:自動和手動

自動備份

我們可以在redis.conf檔案中配置自動備份的條件
在這裡插入圖片描述

手動備份

可以通過執行save或者gbsave指令讓Redis進行備份

  1. save指令:執行save指令後會阻塞其他程序,只進行備份,前臺不能進行讀寫操作
  2. bgsave:bgsave指令會fork一個子程序,進行非同步備份,不影響前臺操作

怎麼禁用備份

  1. 在配置檔案中不設定save
  2. 將save的值設為空字串

備份後怎麼恢復

Redis每次啟動後都會將redis.conf配置檔案中指定的路徑和檔名所對應的檔案讀入記憶體,以此達到恢復的目的

缺點

  1. 最後一次的資料可能不能進行備份,當Reids出現錯誤退出時,可能還沒來得及備份
  2. 消耗資源,每次備份都需要fork一個子程序

redis.conf其他相關配置

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

AOF:Append Only File

採用什麼什麼方式進行持久化

AOF採用日誌檔案的方式實現Redis的持久化,日誌檔案會記錄使用者對資料庫的每一次寫操作(增刪改)。當需要恢復時,只需要從頭至尾將日誌檔案記錄的命令執行一遍即可。

相關配置

在這裡插入圖片描述

重寫:Rewrite

是什麼

AOF採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制,當AOF檔案的大小超過所設定的閾值時,Redis就會啟動AOF檔案的內容壓縮,只保留可以恢復資料的最小指令集.可以使用命令bgrewriteaof

重寫原理

AOF檔案持續增長而過大時,會fork出一條新程序來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程序的記憶體中資料,每條記錄有一條的Set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof檔案,這點和快照有點類似

觸發條件

Redis會記錄上次重寫時的AOF大小,預設配置是當AOF檔案大小是上次rewrite後大小的一倍且檔案大於64M時觸發
在這裡插入圖片描述

缺點

1.隨著記錄的增多,日誌檔案會越來越大
2.恢復速度比RDB慢

兩者對比

  1. RDB持久化方式能夠在指定的時間間隔能對你的資料進行快照儲存
  2. AOF持久化方式記錄每次對伺服器寫的操作,當伺服器重啟的時候會重新執行這些命令來恢復原始的資料,AOF命令以redis協議追加儲存每次寫的操作到檔案末尾。Redis還能對AOF檔案進行後臺重寫,使得AOF檔案的體積不至於過大
  3. 只做快取:如果你只希望你的資料在伺服器執行的時候存在,你也可以不使用任何持久化方式。
  4. 同時開啟兩種持久化方式
    在這種情況下,當redis重啟的時候會優先載入AOF檔案來恢復原始的資料,因為在通常情況下AOF檔案儲存的資料集要比RDB檔案儲存的資料集要完整。RDB的資料不實時,同時使用兩者時伺服器重啟也只會找AOF檔案。那要不要只使用AOF呢?作者建議不要,因為RDB更適合用於備份資料庫(AOF在不斷變化不好備份),快速重啟,而且不會有AOF可能潛在的bug,留著作為一個萬一的手段。