AOF 是什么
Append Only File
丐黄,通過保存 Redis 服務(wù)器所執(zhí)行的命令來記錄數(shù)據(jù)庫狀態(tài)。
AOF 持久化的實現(xiàn)
命令追加
服務(wù)器在執(zhí)行完一個寫命令后,會以協(xié)議格式將被執(zhí)行的寫命令
追加到服務(wù)器狀態(tài)的 aof_buf 緩沖區(qū)
的末尾:
struct redisServer {
……
// AOF 緩沖區(qū)
sds aof_buf;
……
}
AOF 文件的寫入和同步
AOF 文件的載入和數(shù)據(jù)還原
流程:
AOF 重寫
為什么需要重寫
AOF 持久化是通過保存被執(zhí)行的寫命令來記錄數(shù)據(jù)庫狀態(tài)的,隨著服務(wù)器運行時間的流逝,AOF 文件的內(nèi)容會越來越多,文件體積越來越大
。如果客戶端執(zhí)行了下面的命令:
127.0.0.1:6379> set name yano
OK
127.0.0.1:6379> set name yano2
OK
127.0.0.1:6379> set name yano3
OK
那么 AOF 文件就需要保存 3 條命令淮阐,不僅使保存的 AOF 文件體積變大,還使得 Redis 啟動時載入數(shù)據(jù)變慢刁品。
什么是重寫
AOF 文件重寫(rewrite
)泣特,創(chuàng)建新的 AOF 文件替代現(xiàn)有的 AOF 文件,新舊兩個 AOF 文件所保存的數(shù)據(jù)庫狀態(tài)相同哑诊,但新 AOF 文件不會包含任何浪費空間的冗余命令群扶,體積更小。
如何重寫
不是讀取和分析現(xiàn)有的 AOF 文件內(nèi)容镀裤,而是直接從數(shù)據(jù)庫讀取值組成相應(yīng)的命令 AOF 文件竞阐。
AOF 后臺重寫
為什么需要后臺重寫
重寫函數(shù) aof_rewrite 會進行大量的寫入操作,執(zhí)行這個函數(shù)的線程會被長時間阻塞暑劝,但是 Redis 服務(wù)器使用單個線程來處理命令請求骆莹,如果直接在主線程直接更新,在重寫期間担猛,服務(wù)器將無法處理客戶端發(fā)來的命令請求幕垦。所以將 AOF 重寫程序放到子進程中執(zhí)行。
帶來的問題
子進程在進行 AOF 重寫期間傅联,服務(wù)器進程還需要繼續(xù)處理命令請求先改,新的命令可能對現(xiàn)有的數(shù)據(jù)庫狀態(tài)進行修改,導(dǎo)致服務(wù)器當前數(shù)據(jù)庫狀態(tài)和重寫后的 AOF 文件保存的數(shù)據(jù)狀態(tài)不一致蒸走。
AOF 重寫緩沖區(qū)
為了解決這種數(shù)據(jù)不一致
的問題仇奶,Redis 設(shè)置了一個 AOF 重寫緩沖區(qū)
,在服務(wù)器創(chuàng)建子進程之后開始使用比驻,當 Redis 服務(wù)器執(zhí)行完一個寫命令后该溯,同時將這個寫命令發(fā)送給 AOF 緩沖區(qū)
和 AOF 重寫緩沖區(qū)
:
當子進程完成 AOF 重寫工作后岛抄,它會向父進程發(fā)送一個信號,父進程在收到這個信號后狈茉,會調(diào)用一個信號處理函數(shù):
- 將 AOF 重寫緩沖區(qū)的所有內(nèi)容寫入新的 AOF 文件夫椭,這樣新 AOF 文件所保存的數(shù)據(jù)庫狀態(tài)就與服務(wù)器當前的數(shù)據(jù)庫狀態(tài)一致;
- 對新 AOF 文件改名氯庆,原子覆蓋現(xiàn)有的 AOF 文件蹭秋,完成新舊 AOF 文件的替換。
下圖左邊是正常流程点晴,右邊是 AOF 重寫期間的流程:
注意
在實際中感凤,為了避免在執(zhí)行命令時造成客戶端輸入緩沖區(qū)的溢出悯周,重寫程序在處理列表粒督、哈希表、集合禽翼、有序集合可能帶有多個元素的鍵時屠橄,會先檢查鍵所包含的元素數(shù)量,如果元素數(shù)量超過了一個常量閾值闰挡,重寫程序會使用多條命令來記錄鍵的值锐墙。
實際例子
配置 redis.conf
文件,使用 AOF:
appendonly yes
appendfsync always
appendfilename "appendonly.aof"
dir ./
啟動 Redis server:
src/redis-server redis.conf&
啟動 Redis client:
src/redis-cli
設(shè)置 key:
127.0.0.1:6379> set name yano
OK
127.0.0.1:6379> set name yano2
OK
127.0.0.1:6379> set name yano3
OK
查看 appendonly.aof 文件:
? redis-6.2.6 cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$4
yano
*3
$3
set
$4
name
$5
yano2
*3
$3
set
$4
name
$5
yano3
參考鏈接
Redis 源碼簡潔剖析系列
Java 編程思想-最全思維導(dǎo)圖-GitHub 下載鏈接长酗,需要的小伙伴可以自取~
原創(chuàng)不易溪北,希望大家轉(zhuǎn)載時請先聯(lián)系我,并標注原文鏈接夺脾。