redis持久化之AOF

2021-07-29 11:50:05 字數 2679 閱讀 5851

號外號外,新建

redis

交流討論群:332160890,歡迎加入!!

一、說明

1.1aof

相關配置項

配置項作用aof_rewrite_perc

百分比閾值,當

aof的增量超過這個閾值時,開始

aof的

rewrite操作

aof_rewrite_min_size

當aof

的檔案大小超過該值時才有可能進行

rewrite

操作,預設該值大小為

64m

aof_load_truncated

在意外出現

aof讀取退出時不會停止,而是刪除錯誤之後的資料

aof_rewrite_incremental_fsync

用於標示在

rewrite

過程中是否增量進行

fsync

操作,便於均攤磁碟

io壓力,增量每次寫入自動進行

fsync

aof_no_fsync_on_rewrite

在aof

的rewrite

過程中,正常的

aof操作只進行

write

操作,不進行

fsync操作

aof_state

aof狀態,

aof_on/aof_off/aof_rewrite, aof_rewrite等待rewrite完成

aof_rewrite_scheduled

已計畫進行

aof的

rewrite

過程,這裡可能不是立即進行

rewrite

的時候設定該值

aof_fsync

aof的

fsync

策略,三種:

aof_fsync_no,

不進行fsync

操作;aof_fsync_always,

立即fsync

操作;aof_fsync_everysec

,可以延時

fsync

1.2 aof檔案中命令格式

——————————————

*\r\n      => count表示後面跟著的引數個數

$\r\n         => len表示後面引數字串長度

\r\n

=> argv表示引數字串

——————————————

二、流程分析

2.1、啟動時載入aof檔案

1)main函式中呼叫loaddatafromdisk函式,用於從磁碟中載入資料;

資料操作;

2.2、服務過程中正常新增aof內容

1)當有使用者與redis互動時,任何命令最終都會通過propagate函式將命令內容傳遞給aof當中;

4)上面提到,新增的命令內容並沒有直接寫入到aof檔案中去,那這些記憶體資料是什麼時候寫入進去的呢?實際上,aof_buf中的內容是在另乙個函式中被寫入的,之所以沒有立即寫入,一方面是存在命令頻繁,單次寫入可能會比較浪費的情況;另一方面,這裡面的寫入不單純是write操作這麼簡單,為了保證資料完整性,每次寫入是需要真正寫入到磁碟中去,因此redis採用了其他的方式來完成這一過程;

5)在remain函式中,在處理事件之前,會呼叫beforesleep函式,就是這個函式中,會有寫入aof真正的過程;

2.3、服務aof內容的重寫

1)aof的rewrite

過程一般會在三種情況下發生:

1、配置檔案中設定了

aofrewrite策略;2

、當aof

的大小超過了設定的值;

3、當有客戶端要求

rewrite

操作時(這點是和

rdb不一樣的,由於

aof是累積資料,存在冗餘以及浪費的情況,rdb

是一次性的); 2

)無論上述那種情況,都會呼叫

函式來fork

子程序,用於執行後台

aof的

rewrite

程序,真正執行命令操作的是 3

)在函式中,會依次讀取

db內容,並根據型別的不同,呼叫不同的型別寫入資料函式執行aof寫出命令;

aof的rewrite

過程看似很簡潔,實際上還有其他的內在邏輯: (

1)由於

aof和

rdb不同,

aof是更加接近

實時資料,而

rdb是快照資料,因為在

aof的rewrite

過程中,如果有新的命令過來並且會更新記憶體空間,也就是

3.2.3的流程中提到的,需要將這些命令也傳遞給aof的rewrite

子程序,而這些命令的傳遞是通過管道來實現的;其中,

aofchildwritediffdata函式

用於將主程序中新增的

aof命令緩衝

aof_rewrite_buf_blocks

傳送給子程序;

函式用於在接受新命令時根據要求將新命令內容寫入到緩衝區

aof_rewrite_buf_blocks

中取;aofrewritebufferwrite

是在rewrite

完成後,將

aof_rewrite_buf_blocks

中還沒有傳遞給子程序的資料寫入到新的

aof檔案中;

redis持久化之AOF持久化

aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...

Redis持久化之AOF

aof是redis的另一種持久化方式。什麼是aof?aof的實現原理 aof相關配置 redis的配置檔案 配置檔案的第934行 everysec 將aof buf快取區的所有內容寫入到aof檔案,如果上次同步aof檔案的時間與當前時間大於1秒,那麼會再次對aof檔案進行同步,同步操作由乙個執行緒專...

redis持久化之AOF

這個也是觸發aof的乙個機制 always 是每次資料變化都會記錄下來,並同步到磁碟 everysec 是每秒記錄,並同步到磁碟 no,寫入aof檔案,不會同步 下面我實際操作一下,截 釋一下但是這個問題redis也有相應的解決辦法 rewrite 他其實是增加了重寫機制,當檔案超過所定的閥值的時候...