《Redis設計與實現》之第十一章 AOF持久化

2022-02-05 02:46:45 字數 2370 閱讀 7777

aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式(純文字)儲存的。

一,aof持久化的實現

1.命令追加

當aof持久化功能處於開啟狀態時,伺服器在執行完乙個寫命令後,會以協議格式把被執行的寫命令追加到伺服器狀態的aof_buf緩衝區的末尾:

struct redisserver{

//aof緩衝區

sds aof_buf;

2.aof檔案的寫入和同步

命令請求會先儲存到aof緩衝區中,然後在寫入並同步到aof檔案。

redis伺服器程序是乙個事件迴圈,在這個迴圈中有檔案事件,有時間事件。檔案事件負責接收客戶端的命令請求和向客戶端傳送命令回覆。時間事件負責執行定時執行的函式,比如:servercron函式。

偽**:

def eventloop():

while true:

//處理檔案事件,接收命令請求以及傳送命令回覆。處理命令請求時可能會有新內容被追加到aof_buf緩衝區中

processfileevents()

//處理時間事件

processtimeevents()

//考慮是否要把 aof_buf中的內容寫入和儲存到aof檔案中

寫入:在現代作業系統中,當資料寫入到檔案中時,會呼叫write函式。作業系統會將寫入資料暫時儲存在乙個記憶體快取區中,等到緩衝區空間滿的時候,才真正將緩衝區中的資料寫入到磁碟中。

同步:同時系統也提供了同步函式,它可以強制讓作業系統立即將緩衝區中的資料寫入到磁碟中。

always:伺服器在每個事件迴圈都要將aof_buf緩衝區中的所有內容寫入到aof檔案中,並同步aof檔案(寫入並同步)(,把aof_buf資料寫入並同步到aof檔案中)

everysec:伺服器在每個事件迴圈都要將aof_buf緩衝區中的所有內容寫入到aof檔案中(先寫入),並且每隔一秒就在子執行緒中對aof檔案進行一次同步(每隔一秒同步)。

二,aof檔案的載入和資料還原

1.資料還原:aof檔案中包含了重建資料庫狀態的所有寫命令,所以伺服器只要讀入並重新執行一遍aof檔案裡儲存的寫命令,就可以還原資料

2.步驟:

建立乙個不帶網路連線的偽客戶端。(為什麼是為客戶端:redis的命令只能在客戶端上下文中執行,為什麼是不帶網路連線:命令來自aof檔案而不是網路連線)

從aof檔案中分析並讀取一條寫命令

使用偽客戶端執行被讀出的寫命令

一直執行步驟2,3 。直到aof檔案中的所有寫命令都被處理完畢

三,aof重寫

1.什麼是aof重寫?

為了解決aof檔案體積膨脹,redis伺服器建立乙個新的aof檔案替代現有的aof檔案,新舊兩個檔案儲存的資料庫狀態相同,但是新aof檔案不會包含冗餘命令。

redis把新aof檔案替換舊aof檔案的功能叫 aof檔案重寫。

2.aof檔案重寫的實現

注意:aof檔案重寫並不需要對現有的aof檔案進行如何讀取,分析或寫入操作,這個功能是通過讀取伺服器當前的資料庫狀態來實現的。

原理:首先從資料庫中讀取鍵現在的值,然後用一條命令記錄鍵值對,代替之前記錄這個鍵值對的多條命令。

【如果伺服器想要用盡量少的命令來記錄鍵的狀態,那麼最簡單的辦法不是去讀取和分析現有aof檔案的內容,而是直接從資料庫中讀取鍵的值,然後用一條寫命令來替代儲存在aof檔案中的多條寫命令,這樣就可以把儲存鍵的多條命令減少為一條。】

在實際中,為了避免在執行命令時造成客戶端輸入緩衝區溢位。在處理有多個元素的鍵時,會先檢查鍵包含的元素數量,如果超過了一定的值,會使用多條命令來記錄鍵的值。比如乙個列表鍵包含了超過64個項,那麼重寫程式會用多條rpush命令來儲存這個列表。

3.aof後台重寫

問題:由於redis伺服器使用單個執行緒處理命令請求,當伺服器呼叫aof_rewrite函式時,在重寫aof檔案期間,伺服器無法處理客戶端傳送來的命令請求

解決:把aof重寫程式放到子程序中執行,這樣子程序重寫期間,父程序可以繼續處理命令請求。並且子程序帶有父程序的資料副本。

那麼問題又來了:在子程序進行aof重寫期間,伺服器程序在處理命令請求時可能會改變資料庫狀態,導致伺服器當前資料庫狀態和重寫後的aof檔案儲存的資料庫狀態不一致

為了解決資料不一致問題,redis伺服器設定了乙個aof重寫緩衝區,這個緩衝區在建立子程序之後使用,當redis伺服器執行完乙個寫命令後,會同時把這個寫命令傳送給aof緩衝區和aof重寫緩衝區。

在子程序執行aof重寫期間,伺服器需要:

執行客戶端傳送過來的命令

將執行後的寫命令追加到aof緩衝區

將執行後的寫命令追擊到aof重寫緩衝區

當子程序完成重寫工作後,向父程序傳送乙個訊號,父程序在接到這個訊號後,把aof重寫緩衝區中的所有內容寫到新aof檔案中,並對新的aof檔案進行改名,覆蓋現有的aof檔案。

modern c design 第十一章

本章介紹了經常遇到的雙分派的一種泛型解決方案。c 在語法上實現了單分派,即虛函式,通過動態機制選擇相應的函式。雙分派是形如fun object1 a,object2 b 根據a和b的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...

第十一章3

第十一章 一 滾動元件 awt中的滾動元件包括scrollbar 滾動條 和滾動面板 scrollpane 兩種。1 滾動條scrollbar 在指定的取值範圍內快速選取某一值的功能。i.構造方法 public scrollbar int orientation,int value,int visi...

java第十一章

問題 1 錯誤 2 異常,1 編譯時異常 檢查異常 2 執行時異常 不檢查異常 是否能用 解決,是的就是異常,不是的就是錯誤 問題 1 先驗 2 捕獲 異常捕獲機智 異常的三個種類 1 檢查異常 2 執行時異常 3 錯誤 throw 提示方法呼叫者本方法可能發生異常 throw跟異常物件 throw...