面試官:用了這么久Redis,你了解Redis的AOF持久化嗎桶良?

Redis作為一個(gè)鍵值對(duì)內(nèi)存數(shù)據(jù)庫(kù)(NoSQL)座舍,數(shù)據(jù)都存儲(chǔ)在內(nèi)存當(dāng)中,在處理客戶端請(qǐng)求時(shí)陨帆,所有操作都在內(nèi)存當(dāng)中進(jìn)行曲秉,為什么需要持久化采蚀,以及Redis持久化的RDB方式在這篇文章講的已經(jīng)很透徹了,足以摩擦面試官了承二!

它也是Redis持久化的重要手段之一榆鼠,aof->Append Only File,只追加文件亥鸠,也就是每次處理完請(qǐng)求命令后都會(huì)將此命令追加到aof文件的末尾妆够。而RDB是壓縮成二進(jìn)制等時(shí)機(jī)開(kāi)子進(jìn)程去干這件事。

二负蚊、優(yōu)缺點(diǎn)

1神妹、優(yōu)點(diǎn)

持久化的速度快,因?yàn)槊看味贾皇亲芳蛹易保瑀db每次都全量持久化

數(shù)據(jù)相對(duì)更可靠鸵荠,丟失少,因可以配置每秒持久化伤极、每個(gè)命令執(zhí)行完就持久化

2蛹找、缺點(diǎn)

災(zāi)難性恢復(fù)的時(shí)候過(guò)慢,因?yàn)閍of每次都只追加原命令塑荒,導(dǎo)致aof文件過(guò)大熄赡,但是后面會(huì)rewrite,但是相對(duì)于rdb也是慢的齿税。

會(huì)對(duì)主進(jìn)程對(duì)外提供請(qǐng)求的效率造成影響,接收請(qǐng)求炊豪、處理請(qǐng)求凌箕、寫(xiě)aof文件這三步是串行原子執(zhí)行的。而非異步多線程執(zhí)行的词渤。Redis單線程牵舱!

三、AOF原理

1缺虐、基礎(chǔ)原理

就是每次都在aof文件后面追加命令芜壁。他與主進(jìn)程收到請(qǐng)求、處理請(qǐng)求是串行化的高氮,而非異步并行的慧妄。圖示如下

天天在用Redis,那你對(duì)Redis的AOF持久化到底了解多少呢剪芍?

在這里插入圖片描述

所以aof的頻率高的話絕逼會(huì)對(duì)Redis帶來(lái)性能影響塞淹,因?yàn)槊看味际撬⒈P(pán)操作。跟mysql一樣了罪裹。Redis每次都是先將命令放到緩沖區(qū)饱普,然后根據(jù)具體策略(每秒/每條指令/緩沖區(qū)滿)進(jìn)行刷盤(pán)操作运挫。如果配置的always,那么就是典型阻塞套耕,如果是sec谁帕,每秒的話,那么會(huì)開(kāi)一個(gè)同步線程去每秒進(jìn)行刷盤(pán)操作冯袍,對(duì)主線程影響稍小匈挖。

2、額外擴(kuò)展

其實(shí)Redis每次在寫(xiě)入AOF緩沖區(qū)之前颠猴,他都會(huì)調(diào)用flushAppendOnlyFile()关划,判斷是否需要將AOF緩沖區(qū)的內(nèi)容寫(xiě)入和同步到AOF文件中。這個(gè)決策是由配置文件的三個(gè)策略來(lái)控制的

always

everysec

no

四翘瓮、REWRITE

1贮折、為什么要rewrite?

比如我有業(yè)務(wù)很簡(jiǎn)單资盅,就來(lái)回delete set 同一個(gè)key调榄。就這個(gè)業(yè)務(wù)運(yùn)行了10年,那么aof文件將記錄無(wú)數(shù)個(gè)delete k1呵扛, set k1 xxx每庆。其實(shí)都是重復(fù)的,但是我aof每次都追加今穿,文件變成了1T大小缤灵。這時(shí)候Redis宕機(jī)了,要恢復(fù)蓝晒,你想想1TB大小的aof文件去恢復(fù)腮出,累死了。最主要的是1TB大小只記錄了兩個(gè)命令芝薇,所以壓縮其實(shí)就是來(lái)處理這件事的胚嘲。

2、4.0版本之前的rewrite

Redis4.0之前和Redis4.0的rewrite(重寫(xiě))方式不一樣洛二,Redis4.0之前就是將aof文件中重復(fù)的命令給去掉馋劈。保留最新的命令。進(jìn)而減少aof文件大小晾嘶。比如

set k1 123set k1 345del k1set k1 789

經(jīng)過(guò)rewrite后(Redis4.0之前)妓雾,只會(huì)變成如下

image.png

3、4.0版本以及之后的rewrite

4.0之前的做法效率很是低下变擒,需要逐條命令對(duì)比君珠。4.0開(kāi)始的rewrite支持混合模式(也是就是rdb和aof一起用),直接將rdb持久化的方式來(lái)操作將二進(jìn)制內(nèi)容覆蓋到aof文件中(rdb是二進(jìn)制娇斑,所以很胁咛怼)材部,然后再有寫(xiě)入的話還是繼續(xù)append追加到文件原始命令,等下次文件過(guò)大的時(shí)候再次rewrite(還是按照rdb持久化的方式將內(nèi)容覆蓋到aof中)唯竹。但是這種模式也是配置的乐导,默認(rèn)是開(kāi),也可以關(guān)閉浸颓。

4物臂、rewrite觸發(fā)條件

1、手動(dòng)觸發(fā)

客戶端執(zhí)行bgrewriteaof命令

2产上、自動(dòng)觸發(fā)

通過(guò)以下兩個(gè)配置協(xié)作觸發(fā)

auto-aof-rewrite-min-size

AOF文件最小重寫(xiě)大小棵磷,只有當(dāng)AOF文件大小大于該值時(shí)候才可能重寫(xiě),4.0默認(rèn)配置64mb。

auto-aof-rewrite-percentage

當(dāng)前AOF文件大小和最后一次重寫(xiě)后的大小之間的比率等于或者等于指定的增長(zhǎng)百分比晋涣,如100代表當(dāng)前AOF文件是上次重寫(xiě)的兩倍時(shí)候才重寫(xiě)仪媒。

3、觸發(fā)滿足條件

沒(méi)有BGSAVE命令(RDB持久化)/AOF持久化在執(zhí)行

沒(méi)有BGREWRITEAOF在進(jìn)行谢鹊;

前兩點(diǎn)也就是說(shuō)只允許同時(shí)fork()一個(gè)子進(jìn)程出來(lái)干活算吩。

當(dāng)前AOF文件大小要大于server.aof_rewrite_min_size的值;

當(dāng)前AOF文件大小和最后一次重寫(xiě)后的大小之間的比率等于或者大于指定的增長(zhǎng)百分比(auto-aof-rewrite-percentage參數(shù))

5佃扼、rewrite原理

4.0之前版本的偎巢,和4.0以及之后關(guān)閉混合模式的情況下。

image

天天在用Redis兼耀,那你對(duì)Redis的AOF持久化到底了解多少呢压昼?

aof_rewrite_buf:rewrite(重寫(xiě))緩沖區(qū)、aof_buf:寫(xiě)命令存放的緩沖區(qū)

開(kāi)始bgrewriteaof的時(shí)候瘤运,判斷當(dāng)前有沒(méi)有bgsave/bgrewriteaof在執(zhí)行巢音,若有,則不執(zhí)行尽超,這個(gè)再rdb篇幅也有提到,以及下面很多fork()知識(shí)在rdb都有提到梧躺∷扑看完這篇還不懂Redis的RDB持久化,你們來(lái)打我掠哥!

主進(jìn)程fork()出子進(jìn)程巩踏,在執(zhí)行fork()這個(gè)方法的時(shí)候是阻塞的,子進(jìn)程創(chuàng)建完畢后就不阻塞了

主進(jìn)程fork完子進(jìn)程后续搀,主進(jìn)程能繼續(xù)接收客戶端的請(qǐng)求塞琼,所有寫(xiě)命令依然是寫(xiě)入AOF文件緩沖區(qū)并根據(jù)配置文件的策略同步到磁盤(pán)的。

因?yàn)閒ork的子進(jìn)程僅僅共享主進(jìn)程fork()時(shí)的內(nèi)存禁舷,后期主進(jìn)程在更改內(nèi)存數(shù)據(jù)彪杉,子進(jìn)程是不可見(jiàn)的毅往。因此Redis采取重寫(xiě)緩沖區(qū)(aof_rewite_buf)保存fork之后的客戶端請(qǐng)求。防止新AOF文件生成期間丟失主進(jìn)程執(zhí)行的新命令所生成的數(shù)據(jù)派近。所以此時(shí)客戶端的寫(xiě)請(qǐng)求不僅僅寫(xiě)入原來(lái)的aof_buf緩沖區(qū)攀唯,還寫(xiě)入了重寫(xiě)緩沖區(qū)。這就是我為什么用深藍(lán)色的框給他兩框到一起的原因渴丸。

子進(jìn)程通過(guò)內(nèi)存快照的形式侯嘀,開(kāi)始生成新的aof文件。

新aof文件生成完后谱轨,子進(jìn)程向主進(jìn)程發(fā)信號(hào)戒幔。

主進(jìn)程收到信號(hào)后,會(huì)把重寫(xiě)緩沖區(qū)(aof_rewite_buf)中的數(shù)據(jù)寫(xiě)入到新的AOF文件(主要是避免這部分?jǐn)?shù)據(jù)丟失)

使用新的AOF文件覆蓋舊的AOF文件土童,且標(biāo)記AOF重寫(xiě)完成诗茎。

五、RDB-AOF混合持久化

redis4.0之后才支持娜扇,默認(rèn)開(kāi)啟

1错沃、優(yōu)點(diǎn)

混合持久化結(jié)合了RDB持久化 和 AOF 持久化的優(yōu)點(diǎn),采取了rdb的文件小易于災(zāi)難恢復(fù),同時(shí)結(jié)合AOF雀瓢,增量的數(shù)據(jù)以AOF方式保存了枢析,數(shù)據(jù)更少的丟失。

2刃麸、缺點(diǎn)

兼容性差醒叁,一旦開(kāi)啟了混合持久化,在4.0之前版本都不識(shí)別該aof文件泊业,同時(shí)由于前部分是RDB格式把沼,需要專業(yè)的工具來(lái)閱讀,因?yàn)槭嵌M(jìn)制吁伺,所以閱讀性較差饮睬。

3、原理

需要先掌握看完這篇還不懂Redis的RDB持久化篮奄,你們來(lái)打我捆愁!和此篇幅的aof

混合持久化也是通過(guò)bgrewriteaof完成的,所以基本流程和上述一樣窟却。不同的是當(dāng)開(kāi)啟混合模式時(shí)昼丑,fork出的子進(jìn)程先將共享的內(nèi)存副本全量以RDB的方式寫(xiě)入aof。這樣提高了速度也極大的縮小了aof文件(畢竟都是二進(jìn)制)夸赫。寫(xiě)完還是通知主進(jìn)程菩帝,然后再將重寫(xiě)緩沖區(qū)的內(nèi)容以AOF方式寫(xiě)入到文件,然后替換舊的aof文件。也就是說(shuō)這種模式下的aof文件發(fā)生rewrite后前半部分是rdb格式(REDIS開(kāi)頭的二進(jìn)制數(shù)據(jù))呼奢,后半部分是正常的aof追加的命令(重寫(xiě)緩沖區(qū)里的)宜雀。

4、數(shù)據(jù)恢復(fù)

會(huì)優(yōu)先看是否存在aof文件控妻,若存在則先按照aof文件恢復(fù)州袒,因?yàn)閍of畢竟比rdb全。若aof不存在弓候,則才會(huì)查找rdb是否存在郎哭。這是默認(rèn)的機(jī)制。畢竟aof文件也rewrite成rdb二進(jìn)制格式菇存,文件小夸研,易于回復(fù)。所以redis會(huì)優(yōu)先采取aof依鸥。

六亥至、總結(jié)

此篇都是重點(diǎn),廢話很少贱迟。沒(méi)啥可總結(jié)的姐扮。

最后小編整理了一套技術(shù)資料不僅能精準(zhǔn)消除技術(shù)盲點(diǎn)、累計(jì)面試經(jīng)驗(yàn)衣吠,更可以攻克JVM茶敏、Spring、分布式缚俏、微服務(wù)等技術(shù)難題惊搏。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市忧换,隨后出現(xiàn)的幾起案子恬惯,更是在濱河造成了極大的恐慌,老刑警劉巖亚茬,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酪耳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡刹缝,警方通過(guò)查閱死者的電腦和手機(jī)葡兑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赞草,“玉大人,你說(shuō)我怎么就攤上這事吆鹤〕恚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵疑务,是天一觀的道長(zhǎng)沾凄。 經(jīng)常有香客問(wèn)我梗醇,道長(zhǎng),這世上最難降的妖魔是什么撒蟀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任叙谨,我火速辦了婚禮,結(jié)果婚禮上保屯,老公的妹妹穿的比我還像新娘手负。我一直安慰自己,他們只是感情好姑尺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布竟终。 她就那樣靜靜地躺著,像睡著了一般切蟋。 火紅的嫁衣襯著肌膚如雪统捶。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天柄粹,我揣著相機(jī)與錄音喘鸟,去河邊找鬼。 笑死驻右,一個(gè)胖子當(dāng)著我的面吹牛什黑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旺入,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼兑凿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了茵瘾?” 一聲冷哼從身側(cè)響起礼华,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拗秘,沒(méi)想到半個(gè)月后圣絮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雕旨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年扮匠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凡涩。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棒搜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出活箕,到底是詐尸還是另有隱情力麸,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站克蚂,受9級(jí)特大地震影響闺鲸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜埃叭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一摸恍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赤屋,春花似錦立镶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至莺奔,卻和暖如春欣范,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背令哟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工恼琼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叉讥,地道東北人讥邻。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓苟径,卻偏偏與公主長(zhǎng)得像激捏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盗温,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353