1揣云、AOF持久化是通過(guò)保存Redis服務(wù)器所執(zhí)行的寫命令來(lái)記錄數(shù)據(jù)庫(kù)狀態(tài)的竭鞍,在AOF文件中顺呕,除了用于指定數(shù)據(jù)庫(kù)的select命令是服務(wù)器自動(dòng)添加的之外,其他都是我們之前通過(guò)客戶端發(fā)送的命令
2必指、服務(wù)器啟動(dòng)時(shí)囊咏,可以通過(guò)載入和執(zhí)行AOF文件中保存的命令來(lái)還原服務(wù)器關(guān)閉之前的數(shù)據(jù)庫(kù)狀態(tài)
3、AOF持久化功能的實(shí)現(xiàn)可以分為命令追加(append),文件寫入梅割、文件同步(sync)三個(gè)步驟
4霜第、命令追加
當(dāng)打開aof功能,服務(wù)器在執(zhí)行完一個(gè)寫命令之后户辞,會(huì)以協(xié)議格式將被執(zhí)行的寫命令追加到服務(wù)器狀態(tài)aof_buf緩沖區(qū)末尾
5泌类、aof文件的寫入與同步
5.1、redis的服務(wù)器進(jìn)程就是一個(gè)事件循環(huán)底燎,這個(gè)循環(huán)中刃榨,文件事件負(fù)責(zé)接收客戶端命令請(qǐng)求,以及向客戶端發(fā)送命令回復(fù)双仍,時(shí)間事件則負(fù)責(zé)執(zhí)行像servercron函數(shù)這樣需要特定運(yùn)行的函數(shù)喇澡,服務(wù)器每次結(jié)束一個(gè)事件循環(huán)之前,它都會(huì)調(diào)用flushappendonlyfile函數(shù)殊校,考慮是否需要將aof_buf緩沖區(qū)中的內(nèi)容寫入和保存到aof文件里
5.2晴玖、flushappendonlyfile函數(shù)行為由appendfsync選項(xiàng)值來(lái)決定
always 將aof_buf緩沖區(qū)的所有內(nèi)容寫入并同步到aof文件 效率慢,機(jī)器故障不丟失數(shù)據(jù)
everysec 默認(rèn)值? 將aof_buf緩沖區(qū)中所有內(nèi)容寫入到aof文件为流,如果上次同步aof文件時(shí)間呕屎,距離現(xiàn)在超過(guò)一秒鐘,那么再次對(duì)aof文件進(jìn)行同步敬察,并且這個(gè)同步操作是由一個(gè)線程專門負(fù)責(zé)執(zhí)行的 效率有保證秀睛,機(jī)器故障丟失一秒鐘數(shù)據(jù)
no 將aof_buf緩沖區(qū)的所有內(nèi)容寫入到aof文件,但并不對(duì)aof文件進(jìn)行同步莲祸,何時(shí)同步由操作系統(tǒng)決定 效率高蹂安,機(jī)器故障丟失數(shù)據(jù)不確定
6、aof文件的載入與數(shù)據(jù)還原
6.1锐帜、重新執(zhí)行一遍aof文件里面保存的命令就可以還原服務(wù)器關(guān)閉前的數(shù)據(jù)庫(kù)狀態(tài)
6.2田盈、步驟 創(chuàng)建不帶網(wǎng)絡(luò)連接的偽客戶端 讀取文件一條命令,執(zhí)行缴阎,讀取下一行 執(zhí)行允瞧,知道文件末尾
7、為了解決aof文件體積膨脹問(wèn)題蛮拔,redis提供了aof文件重寫功能述暂,redis可以撞見(jiàn)一個(gè)新的aof文件來(lái)替代現(xiàn)有的aof文件,新舊兩個(gè)數(shù)據(jù)庫(kù)狀態(tài)相同建炫,但是新的不會(huì)包含任何浪費(fèi)空間的冗余命令畦韭,由紫禁城執(zhí)行,子進(jìn)程不是線程肛跌,可以在避免使用鎖情況下艺配,保證數(shù)據(jù)安全性据过,
8、子進(jìn)程執(zhí)行重寫帶來(lái)數(shù)據(jù)庫(kù)狀態(tài)不一致問(wèn)題妒挎,解決這個(gè)問(wèn)題绳锅,創(chuàng)建一個(gè)重寫緩沖區(qū),子進(jìn)程執(zhí)行重寫命令期間酝掩,新命令會(huì)先寫入aof緩沖區(qū)鳞芙,然后寫入aof重寫緩沖區(qū),最后追加到新的aof文件里面