聊聊redis持久化 – 兩種方式

redis提供了兩種持久化的方式缸榛,分別是RDB(Redis DataBase)和AOF(Append Only File)吝羞。

RDB,簡(jiǎn)而言之仔掸,就是在不同的時(shí)間點(diǎn)脆贵,將redis存儲(chǔ)的數(shù)據(jù)生成快照并存儲(chǔ)到磁盤等介質(zhì)上;

AOF起暮,則是換了一個(gè)角度來(lái)實(shí)現(xiàn)持久化卖氨,那就是將redis執(zhí)行過(guò)的所有寫指令記錄下來(lái),在下次redis重新啟動(dòng)時(shí)负懦,只要把這些寫指令從前到后再重復(fù)執(zhí)行一遍筒捺,就可以實(shí)現(xiàn)數(shù)據(jù)恢復(fù)了。

其實(shí)RDB和AOF兩種方式也可以同時(shí)使用纸厉,在這種情況下系吭,如果redis重啟的話,則會(huì)優(yōu)先采用AOF方式來(lái)進(jìn)行數(shù)據(jù)恢復(fù)颗品,這是因?yàn)锳OF方式的數(shù)據(jù)恢復(fù)完整度更高肯尺。

如果你沒(méi)有數(shù)據(jù)持久化的需求,也完全可以關(guān)閉RDB和AOF方式躯枢,這樣的話则吟,redis將變成一個(gè)純內(nèi)存數(shù)據(jù)庫(kù),就像memcache一樣锄蹂。

【聊聊redis持久化 – RDB】

RDB方式氓仲,是將redis某一時(shí)刻的數(shù)據(jù)持久化到磁盤中,是一種快照式的持久化方法得糜。

redis在進(jìn)行數(shù)據(jù)持久化的過(guò)程中敬扛,會(huì)先將數(shù)據(jù)寫入到一個(gè)臨時(shí)文件中,待持久化過(guò)程都結(jié)束了朝抖,才會(huì)用這個(gè)臨時(shí)文件替換上次持久化好的文件啥箭。正是這種特性,讓我們可以隨時(shí)來(lái)進(jìn)行備份治宣,因?yàn)榭煺瘴募偸峭暾捎玫摹?/p>

對(duì)于RDB方式捉蚤,redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來(lái)進(jìn)行持久化抬驴,而主進(jìn)程是不會(huì)進(jìn)行任何IO操作的炼七,這樣就確保了redis極高的性能缆巧。

如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù),且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是非常敏感豌拙,那RDB方式要比AOF方式更加的高效陕悬。

雖然RDB有不少優(yōu)點(diǎn),但它的缺點(diǎn)也是不容忽視的按傅。如果你對(duì)數(shù)據(jù)的完整性非常敏感捉超,那么RDB方式就不太適合你,因?yàn)榧词鼓忝?分鐘都持久化一次唯绍,當(dāng)redis故障時(shí)拼岳,仍然會(huì)有近5分鐘的數(shù)據(jù)丟失。所以况芒,redis還提供了另一種持久化方式惜纸,那就是AOF。

【聊聊redis持久化 – AOF】

AOF绝骚,英文是Append Only File耐版,即只允許追加不允許改寫的文件。

如前面介紹的压汪,AOF方式是將執(zhí)行過(guò)的寫指令記錄下來(lái)粪牲,在數(shù)據(jù)恢復(fù)時(shí)按照從前到后的順序再將指令都執(zhí)行一遍,就這么簡(jiǎn)單止剖。

我們通過(guò)配置redis.conf中的appendonly yes就可以打開AOF功能腺阳。如果有寫操作(如SET等),redis就會(huì)被追加到AOF文件的末尾穿香。

默認(rèn)的AOF持久化策略是每秒鐘fsync一次(fsync是指把緩存中的寫指令記錄到磁盤中)亭引,因?yàn)樵谶@種情況下,redis仍然可以保持很好的處理性能扔水,即使redis故障痛侍,也只會(huì)丟失最近1秒鐘的數(shù)據(jù)。

如果在追加日志時(shí)魔市,恰好遇到磁盤空間滿主届、inode滿或斷電等情況導(dǎo)致日志寫入不完整,也沒(méi)有關(guān)系待德,redis提供了redis-check-aof工具君丁,可以用來(lái)進(jìn)行日志修復(fù)。

因?yàn)椴捎昧俗芳臃绞浇埽绻蛔鋈魏翁幚淼脑捇婷疲珹OF文件會(huì)變得越來(lái)越大橡庞,為此,redis提供了AOF文件重寫(rewrite)機(jī)制印蔗,即當(dāng)AOF文件的大小超過(guò)所設(shè)定的閾值時(shí)扒最,redis就會(huì)啟動(dòng)AOF文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集华嘹。舉個(gè)例子或許更形象吧趣,假如我們調(diào)用了100次INCR指令,在AOF文件中就要存儲(chǔ)100條指令耙厚,但這明顯是很低效的强挫,完全可以把這100條指令合并成一條SET指令,這就是重寫機(jī)制的原理薛躬。

在進(jìn)行AOF重寫時(shí)俯渤,仍然是采用先寫臨時(shí)文件,全部完成后再替換的流程型宝,所以斷電八匠、磁盤滿等問(wèn)題都不會(huì)影響AOF文件的可用性,這點(diǎn)大家可以放心诡曙。

AOF方式的另一個(gè)好處臀叙,我們通過(guò)一個(gè)“場(chǎng)景再現(xiàn)”來(lái)說(shuō)明。某同學(xué)在操作redis時(shí)价卤,不小心執(zhí)行了FLUSHALL劝萤,導(dǎo)致redis內(nèi)存中的數(shù)據(jù)全部被清空了,這是很悲劇的事情慎璧。不過(guò)這也不是世界末日床嫌,只要redis配置了AOF持久化方式,且AOF文件還沒(méi)有被重寫(rewrite)胸私,我們就可以用最快的速度暫停redis并編輯AOF文件厌处,將最后一行的FLUSHALL命令刪除,然后重啟redis岁疼,就可以恢復(fù)redis的所有數(shù)據(jù)到FLUSHALL之前的狀態(tài)了阔涉。是不是很神奇,這就是AOF持久化方式的好處之一捷绒。但是如果AOF文件已經(jīng)被重寫了瑰排,那就無(wú)法通過(guò)這種方法來(lái)恢復(fù)數(shù)據(jù)了。

雖然優(yōu)點(diǎn)多多暖侨,但AOF方式也同樣存在缺陷椭住,比如在同樣數(shù)據(jù)規(guī)模的情況下,AOF文件要比RDB文件的體積大字逗。而且京郑,AOF方式的恢復(fù)速度也要慢于RDB方式宅广。

如果你直接執(zhí)行BGREWRITEAOF命令,那么redis會(huì)生成一個(gè)全新的AOF文件些举,其中便包括了可以恢復(fù)現(xiàn)有數(shù)據(jù)的最少的命令集跟狱。

如果運(yùn)氣比較差,AOF文件出現(xiàn)了被寫壞的情況金拒,也不必過(guò)分擔(dān)憂兽肤,redis并不會(huì)貿(mào)然加載這個(gè)有問(wèn)題的AOF文件,而是報(bào)錯(cuò)退出绪抛。這時(shí)可以通過(guò)以下步驟來(lái)修復(fù)出錯(cuò)的文件:

1.備份被寫壞的AOF文件
2.運(yùn)行redis-check-aof –fix進(jìn)行修復(fù)
3.用diff -u來(lái)看下兩個(gè)文件的差異,確認(rèn)問(wèn)題點(diǎn)
4.重啟redis电禀,加載修復(fù)后的AOF文件

【聊聊redis持久化 – AOF重寫】

AOF重寫的內(nèi)部運(yùn)行原理幢码,我們有必要了解一下。

在重寫即將開始之際尖飞,redis會(huì)創(chuàng)建(fork)一個(gè)“重寫子進(jìn)程”症副,這個(gè)子進(jìn)程會(huì)首先讀取現(xiàn)有的AOF文件,并將其包含的指令進(jìn)行分析壓縮并寫入到一個(gè)臨時(shí)文件中政基。

與此同時(shí)贞铣,主工作進(jìn)程會(huì)將新接收到的寫指令一邊累積到內(nèi)存緩沖區(qū)中,一邊繼續(xù)寫入到原有的AOF文件中沮明,這樣做是保證原有的AOF文件的可用性辕坝,避免在重寫過(guò)程中出現(xiàn)意外。

當(dāng)“重寫子進(jìn)程”完成重寫工作后荐健,它會(huì)給父進(jìn)程發(fā)一個(gè)信號(hào)酱畅,父進(jìn)程收到信號(hào)后就會(huì)將內(nèi)存中緩存的寫指令追加到新AOF文件中。

當(dāng)追加結(jié)束后江场,redis就會(huì)用新AOF文件來(lái)代替舊AOF文件纺酸,之后再有新的寫指令,就都會(huì)追加到新的AOF文件中了址否。

【聊聊redis持久化 – 如何選擇RDB和AOF】

對(duì)于我們應(yīng)該選擇RDB還是AOF餐蔬,官方的建議是兩個(gè)同時(shí)使用。這樣可以提供更可靠的持久化方案佑附。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末樊诺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子帮匾,更是在濱河造成了極大的恐慌啄骇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘟斜,死亡現(xiàn)場(chǎng)離奇詭異缸夹,居然都是意外死亡痪寻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門虽惭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)橡类,“玉大人,你說(shuō)我怎么就攤上這事芽唇」嘶” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵匆笤,是天一觀的道長(zhǎng)研侣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)炮捧,這世上最難降的妖魔是什么庶诡? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮咆课,結(jié)果婚禮上末誓,老公的妹妹穿的比我還像新娘。我一直安慰自己书蚪,他們只是感情好喇澡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殊校,像睡著了一般晴玖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上箩艺,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天窜醉,我揣著相機(jī)與錄音,去河邊找鬼艺谆。 笑死榨惰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的静汤。 我是一名探鬼主播琅催,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虫给!你這毒婦竟也來(lái)了藤抡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抹估,失蹤者是張志新(化名)和其女友劉穎缠黍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體药蜻,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓷式,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年替饿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贸典。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡视卢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出廊驼,到底是詐尸還是另有隱情据过,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布妒挎,位于F島的核電站绳锅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏饥漫。R本人自食惡果不足惜榨呆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望庸队。 院中可真熱鬧,春花似錦闯割、人聲如沸彻消。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宾尚。三九已至,卻和暖如春谢澈,著一層夾襖步出監(jiān)牢的瞬間煌贴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工锥忿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牛郑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓敬鬓,卻偏偏與公主長(zhǎng)得像淹朋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钉答,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 【本教程目錄】 1.redis是什么2.redis的作者3.誰(shuí)在使用redis4.學(xué)會(huì)安裝redis5.學(xué)會(huì)啟動(dòng)r...
    徐猿猿閱讀 1,865評(píng)論 0 35
  • Redis 提供了多種不同級(jí)別的持久化方式: 了解 RDB 持久化和 AOF 持久化之間的異同是非常重要的础芍, 以下...
    笑Skr人啊閱讀 460評(píng)論 0 1
  • 本文檔翻譯自http://redis.io/topics/persistence。 這篇文章提供了 Redis 持...
    daos閱讀 690評(píng)論 0 10
  • 一:快照模式 或莫過(guò)于SNAPSHOTTING模式数尿,這個(gè)不需要反駁吧仑性,而且你可能還知道,使用SNAPSHOTTIN...
    kevin0016閱讀 626評(píng)論 0 1
  • 本文翻譯自官方文檔http://redis.io/topics/persistence 右蹦。 Redis 持久化 R...
    六尺帳篷閱讀 1,629評(píng)論 1 15