持久化數(shù)據(jù)纷捞,也就是將內(nèi)存中的數(shù)據(jù)寫(xiě)入到硬盤(pán)里松靡,大部分原因是為了之后重用數(shù)據(jù)(比如重啟機(jī)器狐榔、機(jī)器故障后恢復(fù)數(shù)據(jù))坛增,或是為了防止系統(tǒng)故障而將數(shù)據(jù)備份到遠(yuǎn)程。
Redis 不同于 Memcached 的重要一點(diǎn)就是薄腻,Redis 支持持久化收捣,且支持兩種不同的持久化操作。
默認(rèn)的持久化方式叫快照(snapshotting庵楷,RDB)株茶,另一種方式是只追加文件(append-only file赫编,AOF)况木。
快照(snapshotting)持久化(RDB)
Redis 可以通過(guò)創(chuàng)建快照來(lái)獲得存儲(chǔ)在內(nèi)存里面的數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)上的副本乃坤。Redis 創(chuàng)建快照之后,可以對(duì)快照進(jìn)行備份弄贿,或者將快照復(fù)制到其他服務(wù)器春锋,從而創(chuàng)建具有相同數(shù)據(jù)的服務(wù)器副本(Redis 主從結(jié)構(gòu),主要用來(lái)提高 Redis 性能)差凹,還可以將快照留在原地期奔,以便重啟服務(wù)器的時(shí)候使用。
快照持久化是 Redis 默認(rèn)采用的持久化方式危尿,在 redis.conf
配置文件中默認(rèn)有此下配置:
save 900 1 # 900秒(15分鐘)后呐萌,如果至少有1個(gè)key發(fā)生變化,Redis 就會(huì)自動(dòng)觸發(fā) BGSAVE 命令創(chuàng)建快照
save 300 10 # 300秒(5分鐘)后谊娇,如果至少有10個(gè)key發(fā)生變化肺孤,Redis 就會(huì)自動(dòng)觸發(fā) BGSAVE 命令創(chuàng)建快照
save 60 10000 # 60秒(1分鐘)后,如果至少有10000個(gè)key發(fā)生變化济欢,Redis 就會(huì)自動(dòng)觸發(fā) BGSAVE 命令創(chuàng)建快照
AOF(append-only file)持久化
與快照持久化相比赠堵,AOF 持久化的實(shí)時(shí)性更好,因此已成為主流的持久化方案法褥。默認(rèn)情況下 Redis 是沒(méi)有開(kāi)啟 AOF(append only file)方式的持久化顾腊,可以通過(guò) appendonly 參數(shù)開(kāi)啟:
appendonly yes
開(kāi)啟 AOF 持久化后,每執(zhí)行一條會(huì)更改 Redis 中的數(shù)據(jù)的命令挖胃,Redis 會(huì)將該命令寫(xiě)入硬盤(pán)中的 AOF 文件。AOF 文件的保存位置和 RDB 文件的位置相同,都是通過(guò) dir 參數(shù)設(shè)置的酱鸭,默認(rèn)的文件名是 appendonly.aof
吗垮。
在 Redis 的配置文件中,存在三種不同的 AOF 持久化方式凹髓,分別是:
appendfsync always # 每次有數(shù)據(jù)修改發(fā)生時(shí)都會(huì)寫(xiě)入 AOF 文件,這樣會(huì)嚴(yán)重降低 Redis 的速度
appendfsync everysec # 每秒鐘同步一次烁登,顯示地將多個(gè)寫(xiě)命令同步到硬盤(pán)(推薦)
appendfsync no # 讓操作系統(tǒng)決定何時(shí)進(jìn)行同步
為兼顧數(shù)據(jù)和寫(xiě)入性能,應(yīng)當(dāng)首先考慮 appendfsync everysec 選項(xiàng) 蔚舀,讓 Redis 每秒同步一次 AOF 文件饵沧,Redis 性能幾乎沒(méi)受到任何影響。而且這樣即使出現(xiàn)系統(tǒng)崩潰赌躺,用戶最多只會(huì)丟失一秒內(nèi)產(chǎn)生的數(shù)據(jù)狼牺。當(dāng)硬盤(pán)忙于執(zhí)行寫(xiě)入操作的時(shí)候,Redis 還會(huì)優(yōu)雅的放慢自己的速度以便適應(yīng)硬盤(pán)的最大寫(xiě)入速度礼患。
Redis 4.0 對(duì)于持久化機(jī)制的優(yōu)化
Redis 4.0 開(kāi)始支持 RDB 和 AOF 的混合持久化(默認(rèn)關(guān)閉是钥,可以通過(guò)配置項(xiàng) aof-use-rdb-preamble
開(kāi)啟)。
如果把混合持久化打開(kāi)缅叠,AOF 重寫(xiě)的時(shí)候就直接把 RDB 的內(nèi)容寫(xiě)到 AOF 文件開(kāi)頭悄泥。這樣做的好處是可以結(jié)合 RDB 和 AOF 的優(yōu)點(diǎn), 快速加載同時(shí)避免丟失過(guò)多的數(shù)據(jù)。當(dāng)然缺點(diǎn)也是有的肤粱, AOF 里面的 RDB 部分是壓縮格式而不再是 AOF 格式弹囚,可讀性較差。
AOF 重寫(xiě)
AOF 重寫(xiě)可以產(chǎn)生一個(gè)新的 AOF 文件领曼,這個(gè)新的 AOF 文件和原有的 AOF 文件所保存的數(shù)據(jù)庫(kù)狀態(tài)一樣鸥鹉,但體積更小。
AOF 重寫(xiě)是一個(gè)有歧義的名字悯森,該功能是通過(guò)讀取數(shù)據(jù)庫(kù)中的鍵值對(duì)來(lái)實(shí)現(xiàn)的宋舷,程序無(wú)須對(duì)現(xiàn)有 AOF 文件進(jìn)行任何讀入、分析或者寫(xiě)入操作瓢姻。
在執(zhí)行 BGREWRITEAOF
命令時(shí)祝蝠,Redis 服務(wù)器會(huì)維護(hù)一個(gè) AOF 重寫(xiě)緩沖區(qū),該緩沖區(qū)會(huì)在子進(jìn)程創(chuàng)建新 AOF 文件期間幻碱,記錄服務(wù)器執(zhí)行的所有寫(xiě)命令绎狭。當(dāng)子進(jìn)程完成創(chuàng)建新 AOF 文件的工作之后,服務(wù)器會(huì)將重寫(xiě)緩沖區(qū)中的所有內(nèi)容追加到新 AOF 文件的末尾褥傍,使得新舊兩個(gè) AOF 文件所保存的數(shù)據(jù)庫(kù)狀態(tài)一致儡嘶。最后,服務(wù)器用新的 AOF 文件替換舊的 AOF 文件恍风,以此來(lái)完成 AOF 文件重寫(xiě)操作蹦狂。