除了RDB持久化功能之外,Redis還提供了AOF持久化功能,與RDB持久化通過保存資料庫中的鍵值對來記錄資料庫狀態不同,AOF持久化是通過保存Redis服務器所執行的寫命令來記錄資料庫狀態的,

服務器在啟動時,可以通過載入和執行AOF檔案中保存的命令來還原服務器關閉前的資料庫狀態,
AOF持久化功能的實作可以分為命令追加append、檔案寫入、檔案同步sync三個步驟,
1、服務器在執行完一個寫命令后,會議協議格式將被執行的寫命令追加到服務器狀態的aof_buf緩沖區末尾,
2、Redis的服務器行程是一個時間回圈,這個回圈中的檔案事件負責接收客戶端的命令請求,以及回復,而時間事件則負責執行定時運行的函式,所以服務器每次結束一個事件回圈之前他都會呼叫flushAppendOnlyFile函式,考慮(appendfsync配置)是否將aof_buf緩沖區的內容寫入和保存到AOF檔案中,
appendfsync值:always(每個事件回圈都要同步將aof_buf中的內容寫入AOF檔案)、everysec (每秒)、no(每個事件回圈都要寫,但是時寫入系統緩沖區)
AOF資料還原:
1、創建一個不帶網路的偽客戶端(redis只能在客戶端中執行)
2、從APF檔案中分析并讀出一條寫命令3、使用偽客戶端執行被讀出的寫命令4、重復2、3步驟 直到全部處理完成,
AOF重寫
為解決AOF檔案膨脹問題,Redis創建一個新的AOF檔案,兩個APF檔案保存的資料庫狀態一樣,但是新的AOF檔案去掉了冗余的命令,
AOF重寫不需要讀取舊的AOF檔案,而是直接讀取資料庫中的鍵值,合并多次寫入一個key,保存成一條寫入命令,
AOF重寫不會阻塞主行程,而是創建一個帶有服務器行程的資料副本的子行程,保證在使用鎖的情況下資料安全性,
Redis服務器設定有一個AOF重寫緩沖區,這個緩沖區是在子行程創建后,Redis主行程每執行一條寫命令,同時會將寫命令發送到AOF緩沖區和AOF重寫緩沖區,保證了AOF在重寫時資料同步問題,
AOF重寫完成后,向父行程發送信號,父行程將內容寫入新的AOF檔案,并改名覆寫掉原先的AOF檔案,完成新舊檔案的替換,在這個過成功,只有信號處理函式執行時 ,服務器行程造成阻塞,AOF后臺重寫不會阻塞行程,
每天學一點,總會有識訓,
說明:尊重作者知識產權,文中內容參考《Redis設計與實作》,僅在此做學習與大家分享,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/2460.html
標籤:NoSQL
