1、AOF持久化是通過保存Redis服務(wù)器所執(zhí)行的寫命令來記錄數(shù)據(jù)庫狀態(tài)的,在AOF文件中,除了用于指定數(shù)據(jù)庫的select命令是服務(wù)器自動(dòng)添加的之外,其他都是我們之前通過客戶端發(fā)送的命令
2、服務(wù)器啟動(dòng)時(shí),可以通過載入和執(zhí)行AOF文件中保存的命令來還原服務(wù)器關(guān)閉之前的數(shù)據(jù)庫狀態(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é)接收客戶端命令請求,以及向客戶端發(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)值來決定
always 將aof_buf緩沖區(qū)的所有內(nèi)容寫入并同步到aof文件 效率慢,機(jī)器故障不丟失數(shù)據(jù)
everysec 默認(rèn)值? 將aof_buf緩沖區(qū)中所有內(nèi)容寫入到aof文件,如果上次同步aof文件時(shí)間,距離現(xiàn)在超過一秒鐘,那么再次對aof文件進(jìn)行同步,并且這個(gè)同步操作是由一個(gè)線程專門負(fù)責(zé)執(zhí)行的 效率有保證,機(jī)器故障丟失一秒鐘數(shù)據(jù)
no 將aof_buf緩沖區(qū)的所有內(nèi)容寫入到aof文件,但并不對aof文件進(jìn)行同步,何時(shí)同步由操作系統(tǒng)決定 效率高,機(jī)器故障丟失數(shù)據(jù)不確定
6、aof文件的載入與數(shù)據(jù)還原
6.1、重新執(zhí)行一遍aof文件里面保存的命令就可以還原服務(wù)器關(guān)閉前的數(shù)據(jù)庫狀態(tài)
6.2、步驟 創(chuàng)建不帶網(wǎng)絡(luò)連接的偽客戶端 讀取文件一條命令,執(zhí)行,讀取下一行 執(zhí)行,知道文件末尾
7、為了解決aof文件體積膨脹問題,redis提供了aof文件重寫功能,redis可以撞見一個(gè)新的aof文件來替代現(xiàn)有的aof文件,新舊兩個(gè)數(shù)據(jù)庫狀態(tài)相同,但是新的不會(huì)包含任何浪費(fèi)空間的冗余命令,由紫禁城執(zhí)行,子進(jìn)程不是線程,可以在避免使用鎖情況下,保證數(shù)據(jù)安全性,
8、子進(jìn)程執(zhí)行重寫帶來數(shù)據(jù)庫狀態(tài)不一致問題,解決這個(gè)問題,創(chuàng)建一個(gè)重寫緩沖區(qū),子進(jìn)程執(zhí)行重寫命令期間,新命令會(huì)先寫入aof緩沖區(qū),然后寫入aof重寫緩沖區(qū),最后追加到新的aof文件里面