在 Redis 中客戶端向伺服器發送相關寫命令請求,這時伺服器中有個用於處理這些命令的事件迴圈進程,對這些命令進行處理,並將相關信息處理的結果反饋給客戶端,如:"OK",等。同時,在這個期間,伺服器中命令請求器會將相關寫命令追加到 aof_buf 緩衝區和 aof_rewrite_buf 重寫緩衝區 ...
在 Redis 中客戶端向伺服器發送相關寫命令請求,這時伺服器中有個用於處理這些命令的事件迴圈進程,對這些命令進行處理,並將相關信息處理的結果反饋給客戶端,如:"OK",等。同時,在這個期間,伺服器中命令請求器會將相關寫命令追加到 aof_buf 緩衝區和 aof_rewrite_buf 重寫緩衝區。
這個階段伺服器進程會處理這三個操作:
(1)執行客戶端的命令。
(2)將執行後的寫命令 append 入 aof_buf 中。
(3)將執行後的寫命令 append 入 aof_rewrite_buf 中。
圖 1 寫命令追加到緩衝區中
當進行 AOF持久化的時候,對於 aof_buf 中的數據需要寫入並同步到 appendonly.aof 文件中。
圖 2 AOF持久化
是否將 aof_buf 緩衝區中內容寫入AOF文件中,由 redis.conf 配置文件中的 appendfsync 設置的值來決定,通過 flushAppendFile 函數來進行相關操作。
//事件輪詢函數 def evenloop(): while True: ........ //是否將 aof_buf 緩衝區中的內容寫入並同步到 appendonly.aof 文件中。 flushAppendOnlyFile()
appendfsync 選項的值 | flushAppendOnlyFile 函數的行為 |
always | 將 aof_buf 緩衝區中的所有內容寫入並同步到 AOF 文件中(最安全,但性能差) |
everysec | 將 aof_buf 緩衝區中的所有內容寫入並同步到 AOF 文件中,如果上次同步 AOF 文件的時間距離現在超過 1 秒鐘,那麼會再次對 AOF 文件進行同步。 (安全,性能較好) |
no |
將 aof_buf 緩衝區中的所有內容寫入並同步到 AOF 文件中,但不對 AOF 文件進行同步,何時進行同步一般有操作系統來決定。(一般為 30 秒,不安全,性能最好) |
對於操作系統來說,為了提高對文件的寫入操作,一般都是等緩衝區滿了或者設置了同步時間,才會將記憶體緩衝區中的數據寫入到磁碟中,完成相關持久化工作。這就可以把寫入操作比作把東西寫到文本中,同步比作保存。如果沒有進行保存,電腦宕機之後,寫入文本中的數據會全部丟失。而對於 Redis 來說,要將緩衝區中的數據同步到 aof 文件中,才能避免 Redis 突然宕機後,進行相關數據信息的恢復操作。