redis 提供了AOF 和RDB 持久化功能。AOF 持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的,如下圖所示:
1 AOF 持久化的實現可以為追加,檔案寫入,檔案同步三個步驟。
命令追加
當AOF持久化功能處於開啟狀態時,伺服器在執行完一個寫入命令之後,會以協議格式將被執行的寫入命令追加到伺服器狀態的aof_buf快取區的末尾:
struct redisServer{
// ....
// aof 快取區
sds aof_buf;
// ...
}:
舉個例子,如果客戶端向伺服器傳送以下的命令:
redis>set key value
ok
那麼伺服器在執行這個set命令後,會將以下協議內容追加到aof_buf快取區的末尾:
.3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvaluse\r\n
2 AOF 檔案的寫入與同步
redis 的伺服器程式就是一個事件迴圈,這個迴圈中的檔案事件負責接收客戶端的命令請求,以及向客戶端傳送命令
回覆,而時間事件則負責執行像servercrom 函式這樣需要定時執行的函式。
因為伺服器在處理檔案事件時可能會執行寫命令,使得一些內容被追加到aof_buf快取區裡面,所以在伺服器每次結束一個事件迴圈以前,它都會呼叫flushAppendonlyfile 函式,考慮是否需要將aof_buf快取區中內容寫入和儲存到AOF 檔案裡面。這個過程可以用虛擬碼來表示:
如果使用者沒有主動為appendfsync選項設定值,那麼appendfsync 選項的預設值為everysec.
舉個例子,假設伺服器在處理檔案期間,執行了以下三個寫入命令:
如果這時flushappendonlyfile 函式被呼叫,假設伺服器當前appendfsync 選項的值為everysec ,並且距離上次同步AOF
檔案已經超過1 秒鐘,那麼伺服器會先將aof_buf 中的內容寫入aof檔案中,然後再對aof檔案進行同步。
1 AOF 持久化的實現可以為追加,檔案寫入,檔案同步三個步驟。
命令追加
當AOF持久化功能處於開啟狀態時,伺服器在執行完一個寫入命令之後,會以協議格式將被執行的寫入命令追加到伺服器狀態的aof_buf快取區的末尾:
struct redisServer{
// ....
// aof 快取區
sds aof_buf;
// ...
}:
舉個例子,如果客戶端向伺服器傳送以下的命令:
redis>set key value
ok
那麼伺服器在執行這個set命令後,會將以下協議內容追加到aof_buf快取區的末尾:
.3\r\n$3\r\nset\r\n$3\r\nkey\r\n$5\r\nvaluse\r\n
2 AOF 檔案的寫入與同步
redis 的伺服器程式就是一個事件迴圈,這個迴圈中的檔案事件負責接收客戶端的命令請求,以及向客戶端傳送命令
回覆,而時間事件則負責執行像servercrom 函式這樣需要定時執行的函式。
因為伺服器在處理檔案事件時可能會執行寫命令,使得一些內容被追加到aof_buf快取區裡面,所以在伺服器每次結束一個事件迴圈以前,它都會呼叫flushAppendonlyfile 函式,考慮是否需要將aof_buf快取區中內容寫入和儲存到AOF 檔案裡面。這個過程可以用虛擬碼來表示:
如果使用者沒有主動為appendfsync選項設定值,那麼appendfsync 選項的預設值為everysec.
舉個例子,假設伺服器在處理檔案期間,執行了以下三個寫入命令:
如果這時flushappendonlyfile 函式被呼叫,假設伺服器當前appendfsync 選項的值為everysec ,並且距離上次同步AOF
檔案已經超過1 秒鐘,那麼伺服器會先將aof_buf 中的內容寫入aof檔案中,然後再對aof檔案進行同步。
更多python學習資料可關注:gzitcast