Redis教程(二)——Redis的持久化

ok,今天我們來(lái)整理下Redis持久化這個(gè)知識(shí)點(diǎn),Redis的持久化對(duì)于分布式緩存來(lái)說(shuō)是必不可少的一個(gè)部分,試想,一個(gè)高流量的系統(tǒng)乖杠,如果突然某些原因?qū)е孪到y(tǒng)宕機(jī),那么怎么樣才能將緩存中的數(shù)據(jù)重新找回呢澄成?這時(shí)Redis的持久化就派上用場(chǎng)了滑黔。

在了解Redis持久化之前笆包,我們還是帶著問(wèn)題去學(xué)習(xí):

  1. Redis持久化有什么意義,為什么需要持久化
  2. Redis持久化的方式略荡,以及各個(gè)方式的特點(diǎn)和使用方法
  3. 持久化方式的區(qū)別
  4. 企業(yè)級(jí)的持久化方案

Redis持久化

對(duì)于生產(chǎn)數(shù)據(jù)而言,在系統(tǒng)服務(wù)的過(guò)程中歉胶,由于某些原因系統(tǒng)宕機(jī)汛兜,從而導(dǎo)致系統(tǒng)數(shù)據(jù)丟失,這絕對(duì)是一次生成事故通今,是大災(zāi)難粥谬,那么有沒(méi)有一種方法能在不影響系統(tǒng)性能的前提下,能將生產(chǎn)數(shù)據(jù)實(shí)時(shí)備份下來(lái)呢辫塌?答案肯定是有的漏策,而且Redis進(jìn)行很好的支持這個(gè)方法。

Redis通過(guò)持久化這個(gè)功能將生產(chǎn)數(shù)據(jù)有計(jì)劃臼氨、實(shí)時(shí)的保存到磁盤(pán)中掺喻,等Redis服務(wù)端重啟的時(shí)候,將數(shù)據(jù)再重新寫(xiě)入到Redis中储矩,這樣能最大限度的保證生產(chǎn)數(shù)據(jù)的完整性感耙;So,總結(jié)來(lái)說(shuō)持隧,Redis的持久化就是為了數(shù)據(jù)備份即硼,數(shù)據(jù)備份也是為了數(shù)據(jù)恢復(fù)。

Redis持久化的方式

Redis提供兩種持久化的方式:RDB和AOF屡拨,這兩種方式是可以同時(shí)使用的

RDB

RDB是Redis默認(rèn)支持的持久化方式只酥,就是當(dāng)前進(jìn)程的數(shù)據(jù)生產(chǎn)快照存入到磁盤(pán)中。RDB保存到文件中的數(shù)據(jù)是二進(jìn)制數(shù)據(jù)流呀狼,RDB提供配置固定的時(shí)間間隔對(duì)數(shù)據(jù)進(jìn)行快照存儲(chǔ)裂允。

    ## RDB主要涉及redis.conf下的幾個(gè)配置項(xiàng)
    ## 1.持久化時(shí)間間隔設(shè)置,多條配置只要有一條滿足就會(huì)執(zhí)行持久化操作
    ## 每900秒鐘里redis數(shù)據(jù)庫(kù)有1條數(shù)據(jù)被修改則觸發(fā)RDB
    save 900 1  
    ## 每300秒鐘里redis數(shù)據(jù)庫(kù)有10條數(shù)據(jù)被修改則觸發(fā)RDB
    save 300 10
    ## 每60秒鐘里redis數(shù)據(jù)庫(kù)有10000條數(shù)據(jù)被修改則觸發(fā)RDB
    save 60 10000
    ## 持久化文件名稱(chēng)
    dbfilename "dump.rdb"
    ## 持久化數(shù)據(jù)文件保存路徑赠潦,默認(rèn)是/usr/local/redis-5.0.5/src下叫胖,實(shí)際生產(chǎn)過(guò)程中需要配置其他的目錄下
    dir ./

這里有必要說(shuō)明下RDB的原理:

Redis在觸發(fā)持久化后,會(huì)fork一個(gè)子進(jìn)程她奥,此時(shí)父進(jìn)程和子進(jìn)程同在
子進(jìn)程將目前Redis進(jìn)程的全部數(shù)據(jù)寫(xiě)入到一個(gè)臨時(shí)文件RDB中
當(dāng)子進(jìn)程完成對(duì)新RDB文件的寫(xiě)入時(shí)瓮增,Redis用新的RDB的文件覆蓋舊的RDB文件

  1. 觸發(fā)RDB機(jī)制有兩種:手動(dòng)觸發(fā)自動(dòng)觸發(fā)
  • 手動(dòng)觸發(fā):通過(guò)命令來(lái)觸發(fā)持久化
    • 直接輸入save命令就可以持久化,也可以查看通過(guò)命令查看當(dāng)前的持久化方式:
    • bgsave:使用該命令Redis會(huì)fork一個(gè)子進(jìn)程來(lái)負(fù)責(zé)RDB的持久化哩俭,完成持久化后自動(dòng)結(jié)束子進(jìn)程绷跑,相當(dāng)于異步的,所以阻塞只發(fā)生在fork的階段
    ## 查看redis持久化配置
    CONFIG GET save
    ## 修改redis持久化配置
    CONFIG SET save "60 10000"

注意:一般不使用save方法來(lái)持久化凡资,我們知道Redis是單線程的砸捏,所以一旦執(zhí)行save命令谬运,則Redis就會(huì)調(diào)用主進(jìn)程來(lái)執(zhí)行內(nèi)存數(shù)據(jù)持久化到文件中,這里為什么使用主進(jìn)程垦藏,主要是后面介紹的bgsave正好相反梆暖,主進(jìn)程被調(diào)用,則會(huì)阻塞進(jìn)程掂骏,特別是數(shù)據(jù)量特別大的時(shí)候更是如此轰驳。

  • 自動(dòng)觸發(fā):自動(dòng)觸發(fā)是在redis.conf中配置持久化的策略來(lái)生效的,其實(shí)默認(rèn)調(diào)用的也是命令機(jī)制里的bgsave機(jī)
  1. RDB持久化的優(yōu)點(diǎn):
  • RDB會(huì)生成一個(gè)數(shù)據(jù)文件弟灼,這個(gè)數(shù)據(jù)文件都代表某個(gè)特定時(shí)間段的文件级解,可以在linux服務(wù)其中采用定時(shí)備份的機(jī)制來(lái)實(shí)現(xiàn)數(shù)據(jù)的冷備。
  • RDB通過(guò)bgsave來(lái)執(zhí)行持久化對(duì)Redis的對(duì)外服務(wù)影響比較小田绑,因?yàn)槭峭ㄟ^(guò)fork一個(gè)子進(jìn)程來(lái)實(shí)現(xiàn)數(shù)據(jù)的持久化勤哗,所以對(duì)主進(jìn)程的影響就比較小了,這也是為什么Redis默認(rèn)提供RDB的持久化方式
  • 相對(duì)于AOF的持久化機(jī)制來(lái)說(shuō)掩驱,直接一句RDB來(lái)持久化的數(shù)據(jù)來(lái)重啟和恢復(fù)Redis數(shù)據(jù)的速度更快
  1. RDB持久化的缺點(diǎn):
  • RDB持久化是基于時(shí)間間隔的機(jī)制的芒划,也就意味著,如果Redis突然暫停服務(wù)了昙篙,則數(shù)據(jù)的丟失程度比較大腊状,比如在企業(yè)生產(chǎn)過(guò)程中一般按照五分鐘一次的持久化數(shù)據(jù)(這個(gè)按照不同的業(yè)務(wù)需求來(lái)配置持久化的時(shí)間間隔),如果一旦Redis服務(wù)宕機(jī)苔可,則會(huì)丟失5分鐘的數(shù)據(jù)
  • RDB每次在fork子進(jìn)程缴挖,每次持久化的是當(dāng)前Redis中的全部的數(shù)據(jù),如果當(dāng)數(shù)據(jù)量比較大的時(shí)候焚辅,可能會(huì)導(dǎo)致對(duì)客戶(hù)端數(shù)提供的服務(wù)暫停數(shù)毫秒甚至是數(shù)秒

AOF

AOF持久化就是以獨(dú)立的日志來(lái)記錄每次的寫(xiě)命令映屋,然后Redis重啟的時(shí)候 ,重新執(zhí)行AOF的命令來(lái)完成Redis數(shù)據(jù)的恢復(fù)同蜻,這里的日志記錄是每次的寫(xiě)命令而不是二進(jìn)制數(shù)據(jù)流

這里有必要說(shuō)明下AOF的實(shí)現(xiàn)原理:

所有的命令都會(huì)被追加到aof_buf這個(gè)緩沖區(qū)中
接著AOF緩沖區(qū)根據(jù)對(duì)應(yīng)的同步策略想磁盤(pán)中做同步操作棚点,此處的同步策略可以通過(guò)redis.conf中的appendfsync進(jìn)行配置
隨著AOF文件變大,可以通過(guò)rewrite機(jī)制來(lái)壓縮Redis中的數(shù)據(jù)
Redis服務(wù)器重啟會(huì)加載AOF文件用來(lái)恢復(fù)數(shù)據(jù)

  1. AOF必須手動(dòng)開(kāi)啟湾蔓,在redis.conf中設(shè)置如下參數(shù)
    ## 開(kāi)啟AOF持久化瘫析,默認(rèn)關(guān)閉
    appendonly yes
    ## AOF文件名稱(chēng)(默認(rèn))
    appendfilename "appendonly.aof"
    ## AOF持久化策略 有三個(gè)值 always、everysec和no 默認(rèn)是everysec 建議設(shè)置成everysec
    appendfsync everysec
    ## AOF自動(dòng)重寫(xiě)的文件大小跟上一次重寫(xiě)的文件的百分比
    auto-aof-rewrite-percentage 100
    ## AOF自動(dòng)重寫(xiě)的文件的最小值
    auto-aof-rewrite-min-size 64mb

其中appendfsync的配置如下:

可配置的值 配置說(shuō)明
always 服務(wù)器會(huì)在每執(zhí)行一個(gè)事件就把AOF緩沖區(qū)的內(nèi)容強(qiáng)制性的寫(xiě)入硬盤(pán)上的AOF文件里默责,
可以看成你每執(zhí)行一個(gè)redis寫(xiě)入命令就往AOF文件里記錄這條命令贬循,
這保證了數(shù)據(jù)持久化的完整性,但效率是最慢的桃序,卻也是最安全的
everysec 服務(wù)端每執(zhí)行一次寫(xiě)操作(如set杖虾、sadd、rpush)也會(huì)把該條命令追加到一個(gè)單獨(dú)的AOF緩沖區(qū)的末尾媒熊,
并將AOF緩沖區(qū)寫(xiě)入AOF文件奇适,然后每隔一秒才會(huì)進(jìn)行一次文件同步把內(nèi)存緩沖區(qū)里的AOF緩存數(shù)據(jù)真正
寫(xiě)入AOF文件里坟比,這個(gè)模式兼顧了效率的同時(shí)也保證了數(shù)據(jù)的完整性,
即使在服務(wù)器宕機(jī)也只會(huì)丟失一秒內(nèi)對(duì)redis數(shù)據(jù)庫(kù)做的修改
no redis數(shù)據(jù)庫(kù)里的數(shù)據(jù)就算丟失你也可以接受嚷往,
它也會(huì)把每條寫(xiě)命令追加到AOF緩沖區(qū)的末尾葛账,然后寫(xiě)入文件,
但什么時(shí)候進(jìn)行文件同步真正把數(shù)據(jù)寫(xiě)入AOF文件里則由系統(tǒng)自身決定皮仁,
即當(dāng)內(nèi)存緩沖區(qū)的空間被填滿或者是超過(guò)了設(shè)定的時(shí)限后系統(tǒng)自動(dòng)同步注竿。
這種模式下效率是最快的,但對(duì)數(shù)據(jù)來(lái)說(shuō)也是最不安全的
  1. AOF的優(yōu)點(diǎn)
  • 通過(guò)配置同步策略就能實(shí)現(xiàn)實(shí)時(shí)持久化數(shù)據(jù)魂贬,可以同時(shí)兼顧性能和數(shù)據(jù)安全
  • AOF只進(jìn)行文件追加操作,并且redis官方提供redis-check-aof修復(fù)命令裙顽,這樣當(dāng)系統(tǒng)突然宕機(jī)付燥,寫(xiě)入命令不完整時(shí),可以修復(fù)數(shù)據(jù)愈犹,最大程度的保證數(shù)據(jù)的完整性
  • AOF是有序的將寫(xiě)入的命令保存起來(lái)键科,數(shù)據(jù)文件可以清晰的讀懂,對(duì)于數(shù)據(jù)分析對(duì)比來(lái)說(shuō)比較有優(yōu)勢(shì)
  • AOF日志文件以append-only模式寫(xiě)入漩怎,所以沒(méi)有任何磁盤(pán)尋址的開(kāi)銷(xiāo)勋颖,寫(xiě)入性能非常高
  1. AOF的缺點(diǎn)
  • 相對(duì)于RDB來(lái)說(shuō),AOF的文件通常比較大
  • AOF恢復(fù)數(shù)據(jù)的速度比RDB的要慢
  • AOF開(kāi)啟后勋锤,支持的寫(xiě)QPS會(huì)比RDB支持的寫(xiě)QPS低饭玲,因?yàn)锳OF一般會(huì)配置成每秒fsync一次日志文件,當(dāng)然叁执,每秒一次fsync茄厘,性能也還是很高的

Redis持久化操作

我們通過(guò)上面的redis.conf配置文件的修改,開(kāi)啟RDB和AOF持久化的機(jī)制谈宛,然后再Redis中設(shè)置好對(duì)應(yīng)的鍵值

為了測(cè)試RDB的持久化效果次哈,我們可以設(shè)置1秒內(nèi)有1條數(shù)據(jù)變化就執(zhí)行RDB持久化

首先添加數(shù)據(jù)

image


查看是否生成備份文件

image


查看AOF的備份數(shù)據(jù)文件

image


查看RDB的備份數(shù)據(jù)文件

image

RDB和AOF的區(qū)別

比較項(xiàng) RDB AOF
文件大小
備份頻率
數(shù)據(jù)恢復(fù)速度
寫(xiě)QPS
支持重寫(xiě)

Redis企業(yè)級(jí)數(shù)據(jù)持久化

  • 不要僅僅使用RDB,因?yàn)槟菢訒?huì)導(dǎo)致你丟失很多數(shù)據(jù)
  • 也不要僅僅使用AOF吆录,因?yàn)槟菢佑袃蓚€(gè)問(wèn)題窑滞,第一,你通過(guò)AOF做冷備恢筝,沒(méi)有RDB做冷備哀卫,來(lái)的恢復(fù)速度更快; 第二,RDB每次簡(jiǎn)單粗暴生成數(shù)據(jù)快照滋恬,更加健壯聊训,可以避免AOF這種復(fù)雜的備份和恢復(fù)機(jī)制的bug
  • 綜合使用AOF和RDB兩種持久化機(jī)制,用AOF來(lái)保證數(shù)據(jù)不丟失恢氯,作為數(shù)據(jù)恢復(fù)的第一選擇; 用RDB來(lái)做不同程度的冷備带斑,在AOF文件都丟失或損壞不可用的時(shí)候鼓寺,還可以使用RDB來(lái)進(jìn)行快速的數(shù)據(jù)恢復(fù)

AOF的重寫(xiě)機(jī)制

AOF重寫(xiě)的原理:

  1. 先是將當(dāng)前Redis數(shù)據(jù)庫(kù)中的數(shù)據(jù)讀取出來(lái),然后fork一個(gè)子進(jìn)程勋磕,子進(jìn)程會(huì)攜帶主進(jìn)程的數(shù)據(jù)(數(shù)據(jù)為主進(jìn)程上的所有的數(shù)據(jù))副本將數(shù)據(jù)寫(xiě)入到新的AOF備份數(shù)據(jù)文件妈候。
  2. 對(duì)于新執(zhí)行的寫(xiě)入命令,主進(jìn)程會(huì)將其寫(xiě)入到一個(gè)緩存中挂滓,一邊將改動(dòng)追加到現(xiàn)有的AOF文件中苦银,這個(gè)緩存在fork出子進(jìn)程之后開(kāi)始啟用
  3. 當(dāng)子進(jìn)程完成重寫(xiě)工作時(shí),他會(huì)給主進(jìn)程發(fā)送一個(gè)信號(hào)赶站,主進(jìn)程收到這個(gè)信號(hào)后幔虏,會(huì)將緩存中的所有的數(shù)據(jù)寫(xiě)入到新的AOF文件中,同時(shí)將該AOF文件重新替換原有的AOF文件

流程圖表示

image

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贝椿,一起剝皮案震驚了整個(gè)濱河市想括,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烙博,老刑警劉巖瑟蜈,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異渣窜,居然都是意外死亡铺根,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)乔宿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)位迂,“玉大人,你說(shuō)我怎么就攤上這事予颤《诠伲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蛤虐,是天一觀的道長(zhǎng)党饮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)驳庭,這世上最難降的妖魔是什么刑顺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮饲常,結(jié)果婚禮上蹲堂,老公的妹妹穿的比我還像新娘。我一直安慰自己贝淤,他們只是感情好柒竞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著播聪,像睡著了一般朽基。 火紅的嫁衣襯著肌膚如雪布隔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天稼虎,我揣著相機(jī)與錄音衅檀,去河邊找鬼。 笑死霎俩,一個(gè)胖子當(dāng)著我的面吹牛哀军,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播打却,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杉适,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了柳击?” 一聲冷哼從身側(cè)響起淘衙,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腻暮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體毯侦,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哭靖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侈离。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片试幽。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卦碾,靈堂內(nèi)的尸體忽然破棺而出铺坞,到底是詐尸還是另有隱情,我是刑警寧澤洲胖,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布济榨,位于F島的核電站,受9級(jí)特大地震影響绿映,放射性物質(zhì)發(fā)生泄漏擒滑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一叉弦、第九天 我趴在偏房一處隱蔽的房頂上張望丐一。 院中可真熱鬧,春花似錦淹冰、人聲如沸库车。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)柠衍。三九已至洋满,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拧略,已是汗流浹背芦岂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垫蛆,地道東北人禽最。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像袱饭,于是被迫代替她去往敵國(guó)和親川无。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 一虑乖、Redis高可用概述 在介紹Redis高可用之前懦趋,先說(shuō)明一下在Redis的語(yǔ)境中高可用的含義。 我們知道疹味,在w...
    空語(yǔ)閱讀 1,597評(píng)論 0 2
  • 企業(yè)級(jí)redis集群架構(gòu)的特點(diǎn) 海量數(shù)據(jù) 高并發(fā) 高可用 要達(dá)到高可用仅叫,持久化是不可減少的,持久化主要是做災(zāi)難恢復(fù)...
    lucode閱讀 2,206評(píng)論 0 7
  • 本文檔翻譯自http://redis.io/topics/persistence糙捺。 這篇文章提供了 Redis 持...
    daos閱讀 694評(píng)論 0 10
  • 沒(méi)有年輪的樹(shù) : 歹識(shí)不懂鬼畫(huà)符 __ 漢 徘 作者: 何 強(qiáng) " 發(fā)現(xiàn)你不曾有過(guò)诫咱,也...
    天邊的凝紅閱讀 223評(píng)論 0 0
  • 《唐求》 文/培善 一千一百多年了 不來(lái)街子 找不到你 青石板該有你的足跡 蜀王的酒滴 落成味江的名字 山人不該 ...
    培善閱讀 462評(píng)論 2 9