AOF(Append-Only-File)持久化:保存寫狀態(tài)
- 記錄下除了查詢以外的所有變更數(shù)據(jù)庫狀態(tài)的指令
- 以append的形式追加保存到AOF文件中(增量)
解決AOF文件大小不斷增大的問題,原理如下:
Redis 提供了bgrewriteaof 日志重寫指令用于對 AOF 日志進(jìn)行瘦身。其原理就是開辟一個(gè)子進(jìn)程對內(nèi)存進(jìn)行遍歷轉(zhuǎn)換成一系列 Redis 的操作指令,序列化到一個(gè)新的 AOF 日志文件中。(注意這里也是讀內(nèi)存,沒有管歷史文件)
- 調(diào)用fork(),創(chuàng)建一個(gè)子進(jìn)程
- 子進(jìn)程把新的AOF寫到一個(gè)
臨時(shí)文件里,不依賴原來的AOF文件 - 主進(jìn)程持續(xù)將新的變動(dòng)同時(shí)寫到內(nèi)存和原來的AOF里
- 主進(jìn)程會(huì)獲取子進(jìn)程重寫AOF的完成信號,往新AOF同步增量變動(dòng)
- 使用新的AOF文件替換掉舊的AOF文件
- AOF恢復(fù)的過程像是把AOF日志文件里保存的命令重新執(zhí)行一遍一樣
重寫AOF文件的操作,并沒有讀取舊的AOF文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫內(nèi)容用命令的方式(相當(dāng)于rdb)重寫了一個(gè)新的AOF文件 重寫過程分析,建議大家都看看,加強(qiáng)理解
觸發(fā)AOF后臺重寫的條件
AOF重寫可以由用戶通過調(diào)用BgRewriteAOF手動(dòng)觸發(fā)。
服務(wù)器在AOF功能開啟的情況下,會(huì)維持以下三個(gè)變量:
- 記錄當(dāng)前AOF文件大小的變量
aof_current_size。 -
記錄最后一次AOF重寫之后,AOF文件的大小
aof_rewrite_base_size。 -
增長百分比變量
aof_rewrite_perc。
每次當(dāng)serverCron(服務(wù)器周期性操作函數(shù))函數(shù)執(zhí)行時(shí),它會(huì)檢查以下條件是否全部滿足,如果全部滿足的話,就觸發(fā)自動(dòng)的AOF重寫操作:
- 沒有BGSAVE命令(RDB持久化)/AOF持久化在執(zhí)行;
- 沒有BGREWRITEAOF在進(jìn)行;
- 當(dāng)前AOF文件大小要大于server.aof_rewrite_min_size(默認(rèn)為1MB)或者在redis.conf配置了auto-aof-rewrite-min-size大小;
- 當(dāng)前AOF文件大小和最后一次重寫后的大小之間的比率大于或者等于指定的增長百分比(在配置文件設(shè)置了auto-aof-rewrite-percentage參數(shù),不設(shè)置默認(rèn)為100%)
如果前面三個(gè)條件都滿足,并且當(dāng)前AOF文件大小比最后一次AOF重寫時(shí)的大小要大于指定的百分比,那么觸發(fā)自動(dòng)AOF重寫。
當(dāng)既有RDB文件又有AOF文件時(shí)候,Redis啟動(dòng)時(shí)候用哪個(gè)呢?

RDB和AOF的優(yōu)缺點(diǎn)
- RDB優(yōu)點(diǎn):全量數(shù)據(jù)快照,文件小,恢復(fù)快
- RDB缺點(diǎn):無法保存最近一次快照之后的數(shù)據(jù)
- AOF優(yōu)點(diǎn):本質(zhì)上是命令的執(zhí)行日志可讀性高,適合保存增量數(shù)據(jù),數(shù)據(jù)不易丟失
- AOF缺點(diǎn):文件體積大,恢復(fù)時(shí)間長