一、前言
? ? ?前面學(xué)習(xí)了Redis的相關(guān)的十大數(shù)據(jù)類型以及用SpringBoot集成我們的Redis的工具代碼的書寫。從這篇文章開始,就會從Redis相關(guān)的一些理論(也是面試和工作的熱點(diǎn)知識)如:Redis的持久化、Redis的訂閱發(fā)布模型、Redis集群環(huán)境搭建、哨兵模式等等方面介紹Redis相關(guān)的進(jìn)階知識。希望對各位小伙伴能有所幫助。
二、Redis的持久化
1、為什么會有Redis的持久化
首先Redis是我們的緩存,是一種內(nèi)存數(shù)據(jù)庫,如果我們存儲數(shù)據(jù)的時(shí)候,不將數(shù)據(jù)庫狀態(tài)儲存到磁盤中,那么服務(wù)器一旦宕機(jī)、進(jìn)程出現(xiàn)錯(cuò)誤。服務(wù)器中的數(shù)據(jù)也會隨之消失。所以為Redis提供持久化的功能是必不可少的!
2、Redis的持久化是什么
官網(wǎng)原話:
上面是官方對Redis持久化做出的解釋,我們不難看出Redis的持久化就是將數(shù)據(jù)寫入磁盤。而其中的關(guān)鍵操作其實(shí)是RDB與AOF。接下來會其詳細(xì)展開介紹。
3、RDB
1、什么是RDB
Redis Database用官網(wǎng)的話說就是:在指定的時(shí)間間隔內(nèi)將內(nèi)存中數(shù)據(jù)集快照(Snapshot? 像照相機(jī)那樣咔嚓一下)寫入磁盤,如果要恢復(fù)數(shù)據(jù)集則將快照文件讀取到內(nèi)存中。
工作流程:redis中會有一個(gè)父進(jìn)程,正常的處理client發(fā)出的各種請求,此時(shí)如果要觸發(fā)RDB生成RDB文件,則可以通過配置文件修改觸發(fā)的操作我們稱為自動觸發(fā)、或則通過save和bgsave指令來手動觸發(fā)來實(shí)現(xiàn)數(shù)據(jù)備份。此時(shí)父進(jìn)程就會產(chǎn)生(fork)一個(gè)子進(jìn)程來實(shí)現(xiàn)持久化,會先將數(shù)據(jù)寫入一個(gè)臨時(shí)文件中,待持久化結(jié)束后,再用這個(gè)臨時(shí)文件代替上次持久化好的文件(rdb保存的文件就是一個(gè)dump.rdb文件)。整個(gè)過程主進(jìn)程不進(jìn)行 任何IO操作,確保了極高的性能。
2、RDB的觸發(fā)
①RDB的自動觸發(fā)
首先我們找到我們Redis下載的文件目錄,我們找到以.conf結(jié)束的文件:
打開這個(gè)文件找到我們的快照Snapshot?
正如Redis的配置文件所示?save <seconds> <changes>,當(dāng)我們的時(shí)間間隔大于等于設(shè)置的seconds,修改次數(shù)大于等于changes時(shí),Redis會自動觸發(fā)RDB,生成對應(yīng)的dump.rdb文件。
②RDB的手動觸發(fā)
既然有自動觸發(fā),為什么需要手動觸發(fā)呢。因?yàn)樽詣佑|發(fā)是規(guī)定操作內(nèi)生成dump.rdb文件,但是如果有非常重要的數(shù)據(jù)需要及時(shí)存儲,但是又不滿足自動觸發(fā)的需求。這時(shí)Redis官方,就為我們提供了save和bgsave兩種手動觸發(fā)的操作來 生成RDB文件。
a.save指令
用戶可以通過執(zhí)行SAVE命令,要求Redis服務(wù)器以同步方式創(chuàng)建出一個(gè)記錄了服務(wù)器當(dāng)前所有數(shù)據(jù)庫數(shù)據(jù)的RDB文件。而且再持久化完成save指令的整個(gè)期間內(nèi),Redis都不能處理 其他的命令。SAVE命令是一個(gè)無參數(shù)命令,它在創(chuàng)建RDB文件成功時(shí)將返回OK作為結(jié)果。(注:線上禁止使用,不推薦)
b.bgsave
Redis會在后臺異步進(jìn)行拍照操作,不阻塞快照同時(shí)還可以響應(yīng)客戶端的請求,該持久化化會fork一個(gè)子進(jìn)程,由子進(jìn)程復(fù)制持久化的過程(父進(jìn)程與子進(jìn)程各做各的,會不干擾)。
③總結(jié)rdb文件的觸發(fā)
1:通過我們的各種觸發(fā)操作,會自動觸發(fā)rdb規(guī)則;
2:除了以上,執(zhí)行flushdb/flushall命令,也會觸發(fā)rdb規(guī)則(為了保證數(shù)據(jù)的完整性,但是文件里面是空白的);
3:退出redis,也會產(chǎn)生rdb文件。
4:主從復(fù)制時(shí),主節(jié)點(diǎn)自動觸發(fā)。
3、RDB的恢復(fù)
從以下方面恢復(fù)數(shù)據(jù)
①:只需將rdb文件放在我們Redis的啟動目錄下,redis啟動時(shí)候會自動檢查dump.rdb文件恢復(fù)其數(shù)據(jù);
②:物理恢復(fù),一定服務(wù)和備份分機(jī)隔離。(PS:不可以把備份dump.rdb文件和產(chǎn)生redis的服務(wù)器放在同一臺機(jī)器,必須分開存儲,以防生產(chǎn)機(jī)物理損壞后備份文件也掛了)
4、AOF
1、什么是AOF
Append Only File用通俗的話來講:以日志的形式來記錄每個(gè)寫操作,將Redis執(zhí)行的所以寫操作指令記錄下來(讀操作不記錄)。當(dāng)重啟Redis的時(shí)候會將新的持久化的日志文件中的數(shù)據(jù)恢復(fù)。
Redis中AOF的操作流程:
①:Client作為命令的操作者,會在redis中不斷書寫各種指令命令;
②:Redis并不會直接將這些指令命令直接寫入AOF文件,而是先寫在一個(gè)臨時(shí)的AOF文件中(其實(shí)是一個(gè)緩沖區(qū))。當(dāng)這個(gè)臨時(shí)文件的數(shù)量足夠多時(shí),再寫入磁盤,避免了頻繁的IO操作;
③:AOF的臨時(shí)文件會根據(jù)三種寫回策略(后面解釋)將命令寫入磁盤上的AOF文件中;
④:當(dāng)AOF文件中的內(nèi)容越來越多時(shí),會執(zhí)行AOF重寫,起到AOF文件壓縮的目的。
⑤:當(dāng)Redis重啟的時(shí)候會將AOF中的數(shù)據(jù)重新載入。
2、AOF中的常見配置指令
我們像RDB一樣,找到AOF的配置文件,介紹相關(guān)指令:
1:appendonly no?
默認(rèn)不開啟,我們需要手動進(jìn)行配置,將"no"->"yes"
2:appendfilename "appendonly.aof"
表示修改的生成的aof文件的名稱
3:三種回寫策略機(jī)制
appendfsync always:同步回寫,優(yōu):可靠性高,數(shù)據(jù)基本不丟失;缺:是一個(gè)極端,每個(gè)命令都要寫到磁盤,性能影響大。
appendfsync everysec:每秒回寫,優(yōu):性能適中;缺:宕機(jī)時(shí),丟失一秒類數(shù)據(jù)。(Redis默認(rèn))
appendfsync no:OS控制的回寫,優(yōu):新能好;缺:也是一個(gè)極端,宕機(jī)時(shí),丟失數(shù)據(jù)數(shù)據(jù)較多。
4:AOF文件重寫規(guī)則
首先aof默認(rèn)文件無限追加,這樣文件就會越來越大。
同時(shí)滿足以下的關(guān)系,才會觸發(fā)AOF的重寫:
auto-aof-rewrite-percentage 100:根據(jù)上次重寫后的aof大小,判斷當(dāng)前aof是不是增長了一倍
auto-aof-rewrite-min-size 64mb:如果aof文件大于64M,fork一個(gè)子進(jìn)程來將我們文件進(jìn)行重寫
三、RDB與AOF的各自優(yōu)缺點(diǎn)
1、RDB
優(yōu):
①:適合大規(guī)模的數(shù)據(jù)恢復(fù)
②:可以按照業(yè)務(wù)定時(shí)備份
③:對數(shù)據(jù)完整性和一致性要求不高
④:RDB文件在內(nèi)存中加載速度比AOF快的多
缺:
①:在一定時(shí)間內(nèi)做一次備份,如果redis出現(xiàn)宕機(jī)的話,就會丟失從當(dāng)前開始的最近一次快照期間的數(shù)據(jù)
②:內(nèi)存數(shù)據(jù)的全量同步,數(shù)據(jù)量太大,會大量使用IO,影響服務(wù)器性能
③:fork子進(jìn)程的時(shí)候,會占用一定空間,需要考慮內(nèi)存空間的問題
2、AOF
優(yōu):
①更好的保護(hù)數(shù)據(jù)不丟失、性能高、可做緊急恢復(fù)
缺:
①:在相同數(shù)據(jù)集下,aof文件要遠(yuǎn)大于rdb文件,恢復(fù)速度慢?
②:aof的效率慢于rdb,所以redis默認(rèn)的是使用rdb持久化
四、RDB和AOF的混合使用
1、誰的優(yōu)先級大
我們知道Redis默認(rèn)使用的是RDB,那么如果將aof與 rdb同時(shí)開啟,是不是rdb的優(yōu)先級就更大,先加載RDB文件呢?我們先來看個(gè)流程圖:
從該圖中我們可以看出,如果有aof文件,則先加載aof文件;若沒有aof文件而開啟了rdb則先加載rdb文件,如果兩個(gè)都沒開啟,則該怎么執(zhí)行就怎么執(zhí)行。
2、開啟RDB與AOF的混合模式
①:開啟混合方式
aof-use-rdb-preamble yes(默認(rèn)是yes)
②:開啟結(jié)果
PS:前提是開啟AOF。
RDB做全量的持久化,AOF做增量的持久化:即先使用RDB進(jìn)行快照的儲存,然后使用AOF持久化做所有寫的操作,當(dāng)重寫策略滿足或手動觸發(fā)重寫的時(shí)候,將最新的數(shù)據(jù)存儲為新的RDB記錄。
總的來說最后生成的也是aof文件,但是該文件一部分包含了RDB格式,一部分包含了AOF格式。
如下所示:
文章來源:http://www.zghlxwxcb.cn/news/detail-832590.html
五、總結(jié)
最后做一個(gè)總結(jié),首先博主的這篇博客的記錄是學(xué)習(xí)了b站上up主【狂神說JAVA】、【尚硅谷】的redis學(xué)習(xí)視頻后寫的。然后這篇博客也是在以前Redis版本上的基礎(chǔ)上結(jié)合最新的版本完成的。當(dāng)然博主自己寫的這篇博客也是讓我自己對Redis的持久化功能有了更進(jìn)一步的認(rèn)識,我個(gè)人覺得這篇博客對一些常見的關(guān)于Redis的持久化的面試題的回答是涉及的足夠的。如果對正在閱讀的小伙伴有幫助,不要忘記點(diǎn)贊??哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-832590.html
到了這里,關(guān)于【Redis】理論進(jìn)階篇------Redis的持久化的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!