號外號外,新建
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 他其實是增加了重寫機制,當檔案超過所定的閥值的時候...