磁盤持久化
redis的持久化指的是redis會(huì)把內(nèi)存的中的數(shù)據(jù)寫入到硬盤中辉哥,在redis重新啟動(dòng)的時(shí)候加載這些數(shù)據(jù),從而最大限度的降低緩存丟失帶來(lái)的影響攒射。
RDB(Redis database)模型
RDB在指定的時(shí)間間隔保存數(shù)據(jù)快照证薇。它們非常適合快速恢復(fù)備份。
將內(nèi)存中數(shù)據(jù)以快照的方式寫入到二進(jìn)制文件中,默認(rèn)的文件名為dump.rdb匆篓。
觸發(fā)機(jī)制
1. save
該命令會(huì)阻塞當(dāng)前Redis服務(wù)器,執(zhí)行save命令期間寇窑,Redis不能處理其他命令鸦概,直到RDB過(guò)程完成為止。執(zhí)行完成時(shí)候如果存在老的RDB文件甩骏,就把新的替代掉舊的窗市。
2. bgsave
執(zhí)行該命令時(shí),Redis會(huì)在后臺(tái)異步進(jìn)行快照操作饮笛,快照同時(shí)還可以響應(yīng)客戶端請(qǐng)求咨察。具體操作是Redis進(jìn)程執(zhí)行fork操作創(chuàng)建子進(jìn)程,RDB持久化過(guò)程由子進(jìn)程負(fù)責(zé)福青,完成后自動(dòng)結(jié)束摄狱。阻塞只發(fā)生在fork階段,一般時(shí)間很短无午∶揭郏基本上 Redis 內(nèi)部所有的RDB操作都是采用 bgsave 命令。
3. 自動(dòng)觸發(fā)
自動(dòng)觸發(fā)是由我們的配置文件來(lái)完成的宪迟。在redis.conf配置文件中酣衷,里面有如下配置,我們可以去設(shè)置:
①save:這里是用來(lái)配置觸發(fā) Redis的 RDB 持久化條件次泽,也就是什么時(shí)候?qū)?nèi)存中的數(shù)據(jù)保存到硬盤穿仪。比如“save m n”席爽。表示m秒內(nèi)數(shù)據(jù)集存在n次修改時(shí),自動(dòng)觸發(fā)bgsave啊片。
表示900 秒內(nèi)如果至少有 1 個(gè) key 的值變化只锻,則保存save 900 1#表示300 秒內(nèi)如果至少有 10 個(gè) key 的值變化,則保存save 300 10#表示60 秒內(nèi)如果至少有 10000 個(gè) key 的值變化钠龙,則保存save 60 10000
不需要持久化炬藤,那么你可以注釋掉所有的 save 行來(lái)停用保存功能。
②stop-writes-on-bgsave-error :默認(rèn)值為yes碴里。當(dāng)啟用了RDB且最后一次后臺(tái)保存數(shù)據(jù)失敗沈矿,Redis是否停止接收數(shù)據(jù)。這會(huì)讓用戶意識(shí)到數(shù)據(jù)沒(méi)有正確持久化到磁盤上咬腋,否則沒(méi)有人會(huì)注意到災(zāi)難(disaster)發(fā)生了羹膳。如果Redis重啟了,那么又可以重新開始接收數(shù)據(jù)了
③rdbcompression 根竿;默認(rèn)值是yes陵像。對(duì)于存儲(chǔ)到磁盤中的快照,可以設(shè)置是否進(jìn)行壓縮存儲(chǔ)寇壳。
④rdbchecksum :默認(rèn)值是yes醒颖。在存儲(chǔ)快照后,我們還可以讓redis使用CRC64算法來(lái)進(jìn)行數(shù)據(jù)校驗(yàn)壳炎,但是這樣做會(huì)增加大約10%的性能消耗泞歉,如果希望獲取到最大的性能提升,可以關(guān)閉此功能匿辩。
⑤dbfilename :設(shè)置快照的文件名腰耙,默認(rèn)是 dump.rdb
⑥dir:設(shè)置快照文件的存放路徑,這個(gè)配置項(xiàng)一定是個(gè)目錄铲球,而不能是文件名挺庞。
save、bgsave差異
RDB優(yōu)勢(shì)稼病、劣勢(shì)
①选侨、優(yōu)勢(shì)
(1)RDB文件緊湊,全量備份溯饵,非常適合用于進(jìn)行備份和災(zāi)難恢復(fù)侵俗。
(2)生成RDB文件的時(shí)候,redis主進(jìn)程會(huì)fork()一個(gè)子進(jìn)程來(lái)處理所有保存工作丰刊,主進(jìn)程不需要進(jìn)行任何磁盤IO操作隘谣。
(3)RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比 AOF 的恢復(fù)速度要快。
②、劣勢(shì)
RDB快照是一次全量備份寻歧,存儲(chǔ)的是內(nèi)存數(shù)據(jù)的二進(jìn)制序列化形式掌栅,存儲(chǔ)上非常緊湊。當(dāng)進(jìn)行快照持久化時(shí)码泛,會(huì)開啟一個(gè)子進(jìn)程專門負(fù)責(zé)快照持久化猾封,子進(jìn)程會(huì)擁有父進(jìn)程的內(nèi)存數(shù)據(jù),父進(jìn)程修改內(nèi)存子進(jìn)程不會(huì)反應(yīng)出來(lái)噪珊,所以在快照持久化期間修改的數(shù)據(jù)不會(huì)被保存晌缘,可能丟失數(shù)據(jù)。
AOF(Append only file)模型
全量備份總是耗時(shí)的痢站,有時(shí)候我們提供一種更加高效的方式AOF磷箕,工作機(jī)制很簡(jiǎn)單,redis會(huì)將每一個(gè)收到的寫命令都通過(guò)write函數(shù)追加到文件中阵难。通俗的理解就是日志記錄岳枷。
原理
每當(dāng)有一個(gè)寫命令過(guò)來(lái)時(shí),就直接保存在我們的AOF文件中呜叫。
文件重寫原理
AOF的方式也同時(shí)帶來(lái)了另一個(gè)問(wèn)題空繁。持久化文件會(huì)變的越來(lái)越大。為了壓縮aof的持久化文件朱庆。redis提供了bgrewriteaof命令盛泡。將內(nèi)存中的數(shù)據(jù)以命令的方式保存到臨時(shí)文件中,同時(shí)會(huì)fork出一條新進(jìn)程來(lái)將文件重寫娱颊。
重寫aof文件的操作饭于,并沒(méi)有讀取舊的aof文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫(kù)內(nèi)容用命令的方式重寫了一個(gè)新的aof文件维蒙,這點(diǎn)和快照有點(diǎn)類似。
觸發(fā)機(jī)制
- 每修改同步always:同步持久化 每次發(fā)生數(shù)據(jù)變更會(huì)被立即記錄到磁盤 性能較差但數(shù)據(jù)完整性比較好
- 每秒同步everysec:異步操作果覆,每秒記錄 如果一秒內(nèi)宕機(jī)颅痊,有數(shù)據(jù)丟失
-
不同no:從不同步
image.png
優(yōu)點(diǎn)
- AOF可以更好的保護(hù)數(shù)據(jù)不丟失,一般AOF會(huì)每隔1秒局待,通過(guò)一個(gè)后臺(tái)線程執(zhí)行一次fsync操作斑响,最多丟失1秒鐘的數(shù)據(jù)。
- AOF日志文件沒(méi)有任何磁盤尋址的開銷钳榨,寫入性能非常高舰罚,文件不容易破損。
- AOF日志文件即使過(guò)大的時(shí)候薛耻,出現(xiàn)后臺(tái)重寫操作营罢,也不會(huì)影響客戶端的讀寫。
- AOF日志文件的命令通過(guò)非常可讀的方式進(jìn)行記錄饲漾,這個(gè)特性非常適合做災(zāi)難性的誤刪除的緊急恢復(fù)蝙搔。
比如某人不小心用flushall命令清空了所有數(shù)據(jù),只要這個(gè)時(shí)候后臺(tái)rewrite還沒(méi)有發(fā)生考传,那么就可以立即拷貝AOF文件吃型,將最后一條flushall命令給刪了,然后再將該AOF文件放回去僚楞,就可以通過(guò)恢復(fù)機(jī)制勤晚,自動(dòng)恢復(fù)所有數(shù)據(jù)
缺點(diǎn)
- 對(duì)于同一份數(shù)據(jù)來(lái)說(shuō),AOF日志文件通常比RDB數(shù)據(jù)快照文件更大
- AOF開啟后泉褐,支持的寫QPS會(huì)比RDB支持的寫QPS低赐写,因?yàn)锳OF一般會(huì)配置成每秒fsync一次日志文件,當(dāng)然兴枯,每秒一次fsync血淌,性能也還是很高的
- 以前AOF發(fā)生過(guò)bug,就是通過(guò)AOF記錄的日志财剖,進(jìn)行數(shù)據(jù)恢復(fù)的時(shí)候悠夯,沒(méi)有恢復(fù)一模一樣的數(shù)據(jù)出來(lái)。
RDB和AOF到底該如何選擇
選擇的話躺坟,兩者加一起才更好沦补。因?yàn)閮蓚€(gè)持久化機(jī)制你明白了,剩下的就是看自己的需求了咪橙,需求不同選擇的也不一定夕膀,但是通常都是結(jié)合使用。有一張圖可供總結(jié):
轉(zhuǎn)載:https://baijiahao.baidu.com/s?id=1654694618189745916&wfr=spider&for=pc