在 Redis 中客戶端向服務器發送相關寫命令請求,這時服務器中有個用於處理這些命令的事件循環進程,對這些命令進行處理,並將相關信息處理的結果反饋給客戶端,如:"OK",等。同時,在這個期間,服務器中命令請求器會將相關寫命令追加到 aof_buf 緩衝區和 aof_rewrite_buf 重寫緩衝區。python
這個階段服務器進程會處理這三個操做:redis
(1)執行客戶端的命令。安全
(2)將執行後的寫命令 append 入 aof_buf 中。服務器
(3)將執行後的寫命令 append 入 aof_rewrite_buf 中。app
圖 1 寫命令追加到緩衝區中函數
當進行 AOF持久化的時候,對於 aof_buf 中的數據須要寫入並同步到 appendonly.aof 文件中。oop
圖 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 文件進行同步。 (安全,性能較好) |
noblog |
將 aof_buf 緩衝區中的全部內容寫入並同步到 AOF 文件中,但不對 AOF 文件進行同步,什麼時候進行同步通常有操做系統來決定。(通常爲 30 秒,不安全,性能最好) |
對於操做系統來講,爲了提升對文件的寫入操做,通常都是等緩衝區滿了或者設置了同步時間,纔會將內存緩衝區中的數據寫入到磁盤中,完成相關持久化工做。這就能夠把寫入操做比做把東西寫到文本中,同步比做保存。若是沒有進行保存,計算機宕機以後,寫入文本中的數據會所有丟失。而對於 Redis 來講,要將緩衝區中的數據同步到 aof 文件中,才能避免 Redis 忽然宕機後,進行相關數據信息的恢復操做。