1. 程式人生 > >(六)、Redis的AOF持久化---Redis設計與實現讀書筆記

(六)、Redis的AOF持久化---Redis設計與實現讀書筆記

redisServer關於AOF的資料結構

/**
 *Redis 伺服器類
 */
struct redisServer{
    ...
    //AOF快取區
    sds aof_buf;
    ...
}

當伺服器執行完一個寫命令後,會一協議格式將被執行的寫命令追加到伺服器類的aof_buf快取區的末尾。

AOF檔案的寫入、同步

寫入、同步概念

  • 寫入:為了提高檔案的寫入效率,作業系統通常會將寫入資料暫時儲存在記憶體緩衝區,當緩衝區被填滿或超過指定時限後才將緩衝區中的資料寫入到磁碟中
  • 同步:系統提供了fsync和fdatasync兩個同步函式,強制作業系統立即將緩衝區中的資料寫入到磁碟中,保證資料的安全性

appendfsync選項

redis中通過伺服器配置的appendfsync選項的值來決定(flushAppendOnlyFile函式)從aof_buf快取區到磁碟的操作方式:
image

三種選項效率、安全性對比

always:效率最底、最安全
everysec:效率足夠快、相對安全,只丟失1秒資料
no:效率最高、最不安全,丟失上次同步到現在的全部資料

AOF資料載入與還原

image

AOF重寫

重寫定義

為解決AOF檔案不斷膨脹問題,通過AOF重寫功能,Redis伺服器建立一個新的AOD檔案來代替現有的AOF檔案,新舊兩個檔案儲存的資料庫狀態相同,但新AOF檔案不會包含任何浪費空間的冗餘程式碼。

重寫實現原理

從資料中讀取鍵現在的值,然後使用一條命令去記錄鍵值對,代替之前記錄這個鍵值對的多條命令。

重寫實現流程

Redis通過子程序來完成AOF的重寫,並且Redis伺服器為了實現重寫功能,設定了"AOF重寫緩衝區",當子程序在重寫AOF時,Redis伺服器執行一條寫命令後會同時將這個寫命令傳送給"AOF緩衝區"和"AOF重寫緩衝區"
image

當子程序完成AOF重寫工作後,會呼叫一個訊號處理函式將"AOF重寫緩衝區"中的所有內容寫入到新的AOF檔案中,使得新的AOF檔案儲存的資料庫狀態和當前資料庫狀態保持一致,之後對新的AOF檔案進行改名,並且原子地覆蓋現有的AOF檔案,完成新舊AOF檔案的替換。