redis源碼分析(五):數(shù)據(jù)持久化

redis 是基于內(nèi)存讀寫的數(shù)據(jù)庫,所有數(shù)據(jù)都存儲在內(nèi)存中止潮,所以存儲的數(shù)據(jù)大小受到了限制柒莉。但redis依然提供了固化功能,與mysql沽翔,leveldb等數(shù)據(jù)庫不同的是兢孝,redis的存儲功能只是用做備份,恢復(fù)的功能,全量數(shù)據(jù)還是存儲在內(nèi)存中仅偎。
redis內(nèi)部提供了兩種固化數(shù)據(jù)的方式,aof 和rdb橘沥。

1.aof

數(shù)據(jù)寫入

aof全稱appendOnlyFile,要讓redis支持aof方式座咆,需要將配置文件的appendonly配置為"yes"痢艺,并配置appendfsync 為everysec/always/no。everysec是redis推薦的配置介陶,我們默認以這種方式來具體分析堤舒。
每次對數(shù)據(jù)有修改的操作,均會以append的方式寫入server.aof_buf中哺呜,每秒鐘將在時間事件中檢查這個緩沖區(qū)是否為空舌缤,不空則說明有新的更新,將其寫入aof文件中(注意write函數(shù)并非實時寫入硬盤某残,可以用flush函數(shù)來強制刷新未寫入的緩存),并觸發(fā)刷新任務(wù)玻墅,通知bio模塊創(chuàng)建的線程中執(zhí)行介牙。aof的文件是相對"白話"的澳厢,如圖是我本地截取的aof文件:

1.png

'*'后跟的是當前的參數(shù)個數(shù)环础,'$'后跟的是下一個參數(shù)的長度,再后來就是參數(shù)了喳整。一個redis中有多個數(shù)據(jù)庫裸扶,我們需要確定數(shù)據(jù)增改到那個數(shù)據(jù)庫了框都,因此第一句為select db的操作。

除了手動配置的刷新aof規(guī)則外魏保,客戶端可以手動觸發(fā)bgrewriteaof來覆蓋已有的aof文件(未開啟aof配置也是支持這個命令),客戶端發(fā)起此命令后摸屠,redis會fork一個子進程來將內(nèi)存中的數(shù)據(jù)保存到文件中。那么問題來了季二,子進程運行過程中檩咱,redis主進程依然在提供服務(wù)胯舷,如果期間寫入新的數(shù)據(jù)刻蚯,那么主子進程間的數(shù)據(jù)將會不同步桑嘶,如何解決炊汹?期間的數(shù)據(jù)會存儲在鏈表數(shù)據(jù)塊server.aof_rewrite_buf_blocks中逃顶,當主進程用wait方法檢測到子進程退出以后讨便,會調(diào)用backgroundRewriteDoneHandler函數(shù)以政,將緩存的數(shù)據(jù)附加到新的aof文件中霸褒。重寫aof可以減小aof文件的大小,因為部分數(shù)據(jù)失效傲霸,或者來回更改,在everysec的配置中均會保存下來眉反,但是重寫aof之后,無效數(shù)據(jù)寸五,或者中間狀態(tài)的修改均會被忽略梳凛。

數(shù)據(jù)載入

redis剛啟動的時候會優(yōu)先檢查是否開啟aof配置(否則rdb)梳杏,如果是則加載aof配置文件韧拒,每個參數(shù)均以'\n'結(jié)尾,因此讀取/判斷合法十分方便叛溢。創(chuàng)建一個fakeClient來模擬客戶端將數(shù)據(jù)插入內(nèi)存中。這里有一個疑問楷掉,數(shù)據(jù)載入的同時厢蒜,服務(wù)依然處理客戶端的io任務(wù),這樣不怕aof的舊文件寫臟用戶新插入的數(shù)據(jù)么烹植。

2.rdb

數(shù)據(jù)寫入

用戶可以配置redis中save的參數(shù)斑鸦,格式為save sec commit 代表每sec秒,如果有commit次修改草雕,則由服務(wù)自身執(zhí)行一次bgsave操作巷屿。save配置可以有多個,相互之間是或的關(guān)系墩虹。server.dirty用來記錄數(shù)據(jù)修改次數(shù),bgsave完成以后诫钓,會將其置0浓冒。
redis的每次寫入都是全量操作尖坤,步驟如下

  • 1.創(chuàng)建臨時文件稳懒,寫入redis字符串+版本號慢味。

  • 2.寫入select db語句场梆,如果當次db沒有數(shù)據(jù)纯路,跳到下一個或油,沒有更多數(shù)據(jù)庫了驰唬,跳到步驟5顶岸。

  • 3.創(chuàng)建字典的迭代器叫编,循環(huán)字典內(nèi)的元素辖佣。

  • 4.redis都是鍵值對數(shù)據(jù)搓逾,分別寫入超時時間(如果有的話)卷谈,value的類型霞篡,key世蔗,value,其中key和value盡可能的壓縮編碼污淋。如果迭代器到達結(jié)尾顶滩,跳到步驟2寸爆。

  • 5.大于4的版本加入了校驗碼胳泉,校驗和使用crc計算爹脾,用臨時文件覆蓋正式rdb文件找田,流程結(jié)束歌憨。

數(shù)據(jù)載入

這個也沒有懸念了墩衙,怎么寫入务嫡,就怎么加載漆改;讀取到數(shù)據(jù)之后直接調(diào)用dbAdd函數(shù)把數(shù)據(jù)插入到字典server.db[dbnum]->dict中心铃。

對比下aof和rdb挫剑。

1.aof文件相對于直接保存了語句和中間過程去扣。所以更易于開發(fā)者修改查看數(shù)據(jù)樊破。追加修改的命令愉棱,對io哲戚,cpu奔滑,內(nèi)存壓力均較小顺少,相對來說更吃存儲空間朋其。
2.aof的缺點就是rdb的優(yōu)點了脆炎。特別是如果rdb的save參數(shù)保存不當梅猿,redis會頻繁執(zhí)行bgsave命令秒裕,每次都是全量修改粒没,在數(shù)據(jù)量大簇爆,修改頻繁的時候會是個災(zāi)難癞松。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市响蓉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枫甲,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件想幻,死亡現(xiàn)場離奇詭異,居然都是意外死亡脏毯,警方通過查閱死者的電腦和手機闹究,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門食店,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渣淤,“玉大人吉嫩,你說我怎么就攤上這事价认∽悦洌” “怎么了用踩?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵忙迁,是天一觀的道長。 經(jīng)常有香客問我动漾,道長丁屎,這世上最難降的妖魔是什么旱眯? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任晨川,我火速辦了婚禮删豺,結(jié)果婚禮上共虑,老公的妹妹穿的比我還像新娘呀页。我一直安慰自己妈拌,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布尘分。 她就那樣靜靜地躺著,像睡著了一般培愁。 火紅的嫁衣襯著肌膚如雪著摔。 梳的紋絲不亂的頭發(fā)上定续,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天谍咆,我揣著相機與錄音私股,去河邊找鬼摹察。 笑死倡鲸,一個胖子當著我的面吹牛供嚎,可吹牛的內(nèi)容都是我干的旦签。 我是一名探鬼主播查坪,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宁炫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了氮凝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤罩阵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稿壁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幽钢,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡傅是,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喧笔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帽驯。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡书闸,死狀恐怖尼变,靈堂內(nèi)的尸體忽然破棺而出浆劲,到底是詐尸還是另有隱情嫌术,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布度气,位于F島的核電站,受9級特大地震影響蚯嫌,放射性物質(zhì)發(fā)生泄漏哲虾。R本人自食惡果不足惜择示,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一束凑、第九天 我趴在偏房一處隱蔽的房頂上張望栅盲。 院中可真熱鬧汪诉,春花似錦谈秫、人聲如沸扒寄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至硕淑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間置媳,已是汗流浹背于樟。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工拇囊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迂曲,地道東北人寥袭。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓路捧,卻偏偏與公主長得像纠永,于是被迫代替她去往敵國和親鬓长。 傳聞我的和親對象是個殘疾皇子尝江,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 從這篇文章開始涉波,將依次介紹Redis高可用相關(guān)的知識——持久化、復(fù)制(及讀寫分離)啤覆、哨兵苍日、以及集群窗声。 本文將先說明...
    不變甄心閱讀 693評論 0 4
  • 前言 在上一篇文章中相恃,介紹了Redis內(nèi)存模型笨觅,從這篇文章開始拦耐,將依次介紹Redis高可用相關(guān)的知識——持久化见剩、復(fù)...
    Java架構(gòu)閱讀 2,314評論 3 21
  • 企業(yè)級redis集群架構(gòu)的特點 海量數(shù)據(jù) 高并發(fā) 高可用 要達到高可用杀糯,持久化是不可減少的,持久化主要是做災(zāi)難恢復(fù)...
    lucode閱讀 2,206評論 0 7
  • 周五的晚上和同事漫步在繁華的衡山路上固翰,排排坐的酒吧里喧鬧的DJ撩撥著都市男女脆弱而又敏感的神經(jīng),但熱鬧是他們的羹呵,我...
    意語軒閱讀 994評論 8 2
  • 紅衰綠減小院幽,落盡繁華青紅褪冈欢。 ——讀友的詩《煙花故里路,何年與君逢》有感 紅與綠終會被荒涼和干枯所代替涛癌, 春犯戏,...
    Angel李子汐閱讀 844評論 8 32