久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

redis系列

 昵稱(chēng)21532077 2019-12-19

在之前的博文中已經(jīng)詳細(xì)的介紹了redis4.0基礎(chǔ)部分,,并且在memcache和redis對(duì)比中提及redis提供可靠的數(shù)據(jù)持久化方案,而memcache沒(méi)有數(shù)據(jù)持久化方案,,本篇博文將詳細(xì)介紹redis4.0所提供的持久化方案:RDB持久化和AOF持久化以及redis4.0新特性混合持久化,。這里將從原理到配置以及相關(guān)實(shí)踐進(jìn)行說(shuō)明,希望能對(duì)你有所幫助,。

一,、RDB持久化

簡(jiǎn)介

RDB持久化方式是通過(guò)快照(snapshotting)完成的,當(dāng)符合一定條件時(shí),,redis會(huì)自動(dòng)將內(nèi)存中所有數(shù)據(jù)以二進(jìn)制方式生成一份副本并存儲(chǔ)在硬盤(pán)上,。當(dāng)redis重啟時(shí),并且AOF持久化未開(kāi)啟時(shí),,redis會(huì)讀取RDB持久化生成的二進(jìn)制文件(默認(rèn)名稱(chēng)dump.rdb,,可通過(guò)設(shè)置dbfilename修改)進(jìn)行數(shù)據(jù)恢復(fù),對(duì)于持久化信息可以用過(guò)命令“info Persistence”查看,。

快照文件位置

RDB快照文件存儲(chǔ)文件位置由dir配置參數(shù)指明,,文件名由dbfilename指定,如下:

快照觸發(fā)條件

RDB生成快照可自動(dòng)促發(fā),,也可以使用命令手動(dòng)觸發(fā),,以下是redis觸發(fā)執(zhí)行快照條件,后續(xù)會(huì)對(duì)每個(gè)條件詳細(xì)說(shuō)明:

  1. 客戶(hù)端執(zhí)行命令save和bgsave會(huì)生成快照,;

  2. 根據(jù)配置文件save m n規(guī)則進(jìn)行自動(dòng)快照,;

  3. 主從復(fù)制時(shí),,從庫(kù)全量復(fù)制同步主庫(kù)數(shù)據(jù),此時(shí)主庫(kù)會(huì)執(zhí)行bgsave命令進(jìn)行快照,;

  4. 客戶(hù)端執(zhí)行數(shù)據(jù)庫(kù)清空命令FLUSHALL時(shí)候,,觸發(fā)快照;

  5. 客戶(hù)端執(zhí)行shutdown關(guān)閉redis時(shí),,觸發(fā)快照,;

save命令觸發(fā)

客戶(hù)端執(zhí)行save命令,該命令強(qiáng)制redis執(zhí)行快照,,這時(shí)候redis處于阻塞狀態(tài),,不會(huì)響應(yīng)任何其他客戶(hù)端發(fā)來(lái)的請(qǐng)求,直到RDB快照文件執(zhí)行完畢,,所以請(qǐng)慎用,。

實(shí)踐操作:

首先使用info Persistence查看最近一次持久化時(shí)間:

此時(shí)我們執(zhí)行save命令,并再次查看最新快照保存時(shí)間已經(jīng)是最新一次時(shí)間:

當(dāng)然你也可以直接查看RDB數(shù)據(jù)文件目錄下的RDB文件最新時(shí)間:

bgsave命令觸發(fā)

bgsave命令可以理解為background save即:“后臺(tái)保存”,。當(dāng)執(zhí)行bgsave命令時(shí),,redis會(huì)fork出一個(gè)子進(jìn)程來(lái)執(zhí)行快照生成操作,需要注意的redis是在fork子進(jìn)程這個(gè)簡(jiǎn)短的時(shí)間redis是阻塞的(此段時(shí)間不會(huì)響應(yīng)客戶(hù)端請(qǐng)求,,),,當(dāng)子進(jìn)程創(chuàng)建完成以后redis響應(yīng)客戶(hù)端請(qǐng)求。其實(shí)redis自動(dòng)快照也是使用bgsave來(lái)完成的,。

為了能清楚了解bgsave工作過(guò)程,,以下將圖文詳細(xì)描述其工作過(guò)程:

對(duì)上述過(guò)程描述:

  1. 客戶(hù)端執(zhí)行bgsave命令,,redis主進(jìn)程收到指令并判斷此時(shí)是否在執(zhí)行bgrewriteaof(AOF文件重新過(guò)程,,后續(xù)會(huì)講解),如果此時(shí)正好在執(zhí)行則bgsave直接返回,,不fork子進(jìn)程,,如果沒(méi)有執(zhí)行bgrewriteaof重寫(xiě)AOF文件,則進(jìn)入下一個(gè)階段,;

  2. 主進(jìn)程調(diào)用fork方法創(chuàng)建子進(jìn)程,,在創(chuàng)建過(guò)程中redis主進(jìn)程阻塞,所以不能響應(yīng)客戶(hù)端請(qǐng)求,;

  3. 子進(jìn)程創(chuàng)建完成以后,,bgsave命令返回“Background saving started”,此時(shí)標(biāo)志著redis可以響應(yīng)客戶(hù)端請(qǐng)求了,;

  4. 子經(jīng)常根據(jù)主進(jìn)程的內(nèi)存副本創(chuàng)建臨時(shí)快照文件,,當(dāng)快照文件完成以后對(duì)原快照文件進(jìn)行替換;

  5. 子進(jìn)程發(fā)送信號(hào)給redis主進(jìn)程完成快照操作,主進(jìn)程更新統(tǒng)計(jì)信息(info Persistence可查看),子進(jìn)程退出,;

實(shí)踐操作:

執(zhí)行bgsave

查看日志,,能看到6MB文件內(nèi)存副本寫(xiě)到了磁盤(pán)上,同時(shí)打印“Background saving terminated with success”代表文件bgsave操作完成,。

此時(shí)我們查看統(tǒng)計(jì)信息最后一次RDB保存時(shí)間已經(jīng)更新:

 save m n規(guī)則觸發(fā) 

save m n規(guī)則說(shuō)明:在指定的m秒內(nèi),,redis中有n個(gè)鍵發(fā)生改變,則自動(dòng)觸發(fā)bgsave,。該規(guī)則默認(rèn)也在redis.conf中進(jìn)行了配置,,并且可組合使用,滿足其中一個(gè)規(guī)則,,則觸發(fā)bgsave,,在上篇博文也進(jìn)行了解釋?zhuān)缦拢?/p>

以save 900 1為例,表明當(dāng)900秒內(nèi)至少有一個(gè)鍵發(fā)生改變時(shí)候,,redis觸發(fā)bgsave操作,。

實(shí)踐操作:

我們改變一個(gè)鍵,滿足save 900 1 :

此時(shí)查看redis日志,,會(huì)發(fā)現(xiàn)redis立即響應(yīng)開(kāi)始bgsave操作:

FLUSHALL觸發(fā)

flushall命令用于清空數(shù)據(jù)庫(kù),,請(qǐng)慎用,當(dāng)我們使用了則表明我們需要對(duì)數(shù)據(jù)進(jìn)行清空,,那redis當(dāng)然需要對(duì)快照文件也進(jìn)行清空,,所以會(huì)觸發(fā)bgsave。

實(shí)踐操作:

日志:

shutdown觸發(fā)

shutdown命令觸發(fā)就不用說(shuō)了,redis在關(guān)閉前處于安全角度將所有數(shù)據(jù)全部保存下來(lái),,以便下次啟動(dòng)會(huì)恢復(fù),。

實(shí)踐操作:

可以使用客戶(hù)端連入執(zhí)行shutdown命令,也可以直接使用腳本關(guān)閉redis,這里我使用init腳本(系統(tǒng)centos6.X),。

查看日志:

主從觸發(fā)

在redis主從復(fù)制中,從節(jié)點(diǎn)執(zhí)行全量復(fù)制操作,,主節(jié)點(diǎn)會(huì)執(zhí)行bgsave命令,,并將rdb文件發(fā)送給從節(jié)點(diǎn),該過(guò)程會(huì)在復(fù)制篇中進(jìn)行闡述,。

故障恢復(fù)

上面提及到過(guò),,當(dāng)redis意外崩潰或者關(guān)閉再次啟動(dòng)時(shí),此時(shí)AOF持久化未開(kāi)啟時(shí)(默認(rèn)未開(kāi)啟),,將使用RDB快照文件恢復(fù)數(shù)據(jù),。

下面我們停用redis服務(wù)來(lái)模擬故障情況,讓再啟動(dòng)redis服務(wù):

觀察日志會(huì)發(fā)現(xiàn),,啟動(dòng)時(shí)候load RDB文件,。

RDB持久化配置

復(fù)制代碼
save m n#配置快照(rdb)促發(fā)規(guī)則,格式:save <seconds> <changes>#save 900 1  900秒內(nèi)至少有1個(gè)key被改變則做一次快照#save 300 10  300秒內(nèi)至少有300個(gè)key被改變則做一次快照#save 60 10000  60秒內(nèi)至少有10000個(gè)key被改變則做一次快照#關(guān)閉該規(guī)則使用svae “” dbfilename  dump.rdb#rdb持久化存儲(chǔ)數(shù)據(jù)庫(kù)文件名,,默認(rèn)為dump.rdbstop-write-on-bgsave-error yes 
#yes代表當(dāng)使用bgsave命令持久化出錯(cuò)時(shí)候停止寫(xiě)RDB快照文件,no表明忽略錯(cuò)誤繼續(xù)寫(xiě)文件,。rdbchecksum yes#在寫(xiě)入文件和讀取文件時(shí)是否開(kāi)啟rdb文件檢查,,檢查是否有無(wú)損壞,如果在啟動(dòng)是檢查發(fā)現(xiàn)損壞,,則停止啟動(dòng),。dir "/etc/redis"#數(shù)據(jù)文件存放目錄,rdb快照文件和aof文件都會(huì)存放至該目錄,,請(qǐng)確保有寫(xiě)權(quán)限rdbcompression yes#是否開(kāi)啟RDB文件壓縮,,該功能可以節(jié)約磁盤(pán)空間
復(fù)制代碼

 二、AOF持久化

簡(jiǎn)介

當(dāng)redis存儲(chǔ)非臨時(shí)數(shù)據(jù)時(shí),,為了降低redis故障而引起的數(shù)據(jù)丟失,,redis提供了AOF(Append Only File)持久化,從單詞意思講,,將命令追加到文件,。AOF可以將Redis執(zhí)行的每一條寫(xiě)命令追加到磁盤(pán)文件(appendonly.aof)中,在redis啟動(dòng)時(shí)候優(yōu)先選擇從AOF文件恢復(fù)數(shù)據(jù)。由于每一次的寫(xiě)操作,,redis都會(huì)記錄到文件中,,所以開(kāi)啟AOF持久化會(huì)對(duì)性能有一定的影響,但是大部分情況下這個(gè)影響是可以接受的,,我們可以使用讀寫(xiě)速率高的硬盤(pán)提高AOF性能,。與RDB持久化相比,AOF持久化數(shù)據(jù)丟失更少,,其消耗內(nèi)存更少(RDB方式執(zhí)行bgsve會(huì)有內(nèi)存拷貝),。

開(kāi)啟AOF

默認(rèn)情況下,redis是關(guān)閉了AOF持久化,,開(kāi)啟AOF通過(guò)配置appendonly為yes開(kāi)啟,,我們修改配置文件或者在命令行直接使用config set修改,在用config rewrite同步到配置文件,。通過(guò)客戶(hù)端修改好處是不用重啟redis,,AOF持久化直接生效。

AOF持久化過(guò)程 

redisAOF持久化過(guò)程可分為以下階段:

1.追加寫(xiě)入

  redis將每一條寫(xiě)命令以redis通訊協(xié)議添加至緩沖區(qū)aof_buf,這樣的好處在于在大量寫(xiě)請(qǐng)求情況下,,采用緩沖區(qū)暫存一部分命令隨后根據(jù)策略一次性寫(xiě)入磁盤(pán),,這樣可以減少磁盤(pán)的I/O次數(shù),提高性能,。

2.同步命令到硬盤(pán)

  當(dāng)寫(xiě)命令寫(xiě)入aof_buf緩沖區(qū)后,,redis會(huì)將緩沖區(qū)的命令寫(xiě)入到文件,redis提供了三種同步策略,,由配置參數(shù)appendfsync決定,,下面是每個(gè)策略所對(duì)應(yīng)的含義:

  • no:不使用fsync方法同步,而是交給操作系統(tǒng)write函數(shù)去執(zhí)行同步操作,在linux操作系統(tǒng)中大約每30秒刷一次緩沖,。這種情況下,,緩沖區(qū)數(shù)據(jù)同步不可控,并且在大量的寫(xiě)操作下,,aof_buf緩沖區(qū)會(huì)堆積會(huì)越來(lái)越嚴(yán)重,,一旦redis出現(xiàn)故障,數(shù)據(jù)丟失嚴(yán)重,。

  • always:表示每次有寫(xiě)操作都調(diào)用fsync方法強(qiáng)制內(nèi)核將數(shù)據(jù)寫(xiě)入到aof文件,。這種情況下由于每次寫(xiě)命令都寫(xiě)到了文件中, 雖然數(shù)據(jù)比較安全,但是因?yàn)槊看螌?xiě)操作都會(huì)同步到AOF文件中,,所以在性能上會(huì)有影響,,同時(shí)由于頻繁的IO操作,硬盤(pán)的使用壽命會(huì)降低,。

  • everysec:數(shù)據(jù)將使用調(diào)用操作系統(tǒng)write寫(xiě)入文件,,并使用fsync每秒一次從內(nèi)核刷新到磁盤(pán)。 這是折中的方案,,兼顧性能和數(shù)據(jù)安全,,所以redis默認(rèn)推薦使用該配置。

3.文件重寫(xiě)(bgrewriteaof)

  當(dāng)開(kāi)啟的AOF時(shí),,隨著時(shí)間推移,,AOF文件會(huì)越來(lái)越大,當(dāng)然redis也對(duì)AOF文件進(jìn)行了優(yōu)化,即觸發(fā)AOF文件重寫(xiě)條件(后續(xù)會(huì)說(shuō)明)時(shí)候,,redis將使用bgrewriteaof對(duì)AOF文件進(jìn)行重寫(xiě),。這樣的好處在于減少AOF文件大小,同時(shí)有利于數(shù)據(jù)的恢復(fù),。

  為什么重寫(xiě),?比如先后執(zhí)行了“set foo bar1 set foo bar2 set foo bar3” 此時(shí)AOF文件會(huì)記錄三條命令,這顯然不合理,,因?yàn)槲募袘?yīng)只保留“set foo bar3”這個(gè)最后設(shè)置的值,,前面的set命令都是多余的,下面是一些重寫(xiě)時(shí)候策略:

  • 重復(fù)或無(wú)效的命令不寫(xiě)入文件

  • 過(guò)期的數(shù)據(jù)不再寫(xiě)入文件

  • 多條命令合并寫(xiě)入(當(dāng)多個(gè)命令能合并一條命令時(shí)候會(huì)對(duì)其優(yōu)化合并作為一個(gè)命令寫(xiě)入,,例如“RPUSH list1 a RPUSH list1 b" 合并為“RPUSH list1 a b” )

重寫(xiě)觸發(fā)條件 

AOF文件觸發(fā)條件可分為手動(dòng)觸發(fā)和自動(dòng)觸發(fā):

手動(dòng)觸發(fā):客戶(hù)端執(zhí)行bgrewriteaof命令。

自動(dòng)觸發(fā):自動(dòng)觸發(fā)通過(guò)以下兩個(gè)配置協(xié)作生效:

  • 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ě),?!?/p>

redis開(kāi)啟在AOF功能開(kāi)啟的情況下,會(huì)維持以下三個(gè)變量

  • 記錄當(dāng)前AOF文件大小的變量aof_current_size。

  • 記錄最后一次AOF重寫(xiě)之后,,AOF文件大小的變量aof_rewrite_base_size,。

  • 增長(zhǎng)百分比變量aof_rewrite_perc。

每次當(dāng)serverCron(服務(wù)器周期性操作函數(shù))函數(shù)執(zhí)行時(shí),,它會(huì)檢查以下條件是否全部滿足,,如果全部滿足的話,就觸發(fā)自動(dòng)的AOF重寫(xiě)操作:

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

  • 沒(méi)有BGREWRITEAOF在進(jìn)行,;

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

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

重寫(xiě)過(guò)程

  AOF文件重寫(xiě)過(guò)程與RDB快照bgsave工作過(guò)程有點(diǎn)相似,,都是通過(guò)fork子進(jìn)程,,由子進(jìn)程完成相應(yīng)的操作,同樣的在fork子進(jìn)程簡(jiǎn)短的時(shí)間內(nèi),,redis是阻塞的,,以下圖文說(shuō)明其重寫(xiě)過(guò)程:

過(guò)程說(shuō)明:

  aof_rewrite_buf 代表重寫(xiě)緩沖區(qū)      aof_buf代表寫(xiě)寫(xiě)命令存放的緩沖區(qū)

  1.開(kāi)始bgrewriteaof,判斷當(dāng)前有沒(méi)有bgsave命令(RDB持久化)/bgrewriteaof在執(zhí)行,,倘若有,,則這些命令執(zhí)行完成以后在執(zhí)行。

  2.主進(jìn)程fork出子進(jìn)程,,在這一個(gè)短暫的時(shí)間內(nèi),,redis是阻塞的。

  3.主進(jìn)程fork完子進(jìn)程繼續(xù)接受客戶(hù)端請(qǐng)求,,所有寫(xiě)命令依然寫(xiě)入AOF文件緩沖區(qū)并根據(jù)appendfsync策略同步到磁盤(pán),,保證原有AOF文件完整和正確。由于fork的子進(jìn)程僅僅只共享主進(jìn)程fork時(shí)的內(nèi)存,,因此Redis使用采用重寫(xiě)緩沖區(qū)(aof_rewrite_buf)機(jī)制保存fork之后的客戶(hù)端的寫(xiě)請(qǐng)求,,防止新AOF文件生成期間丟失這部分?jǐn)?shù)據(jù)。此時(shí),,客戶(hù)端的寫(xiě)請(qǐng)求不僅僅寫(xiě)入原來(lái)aof_buf緩沖,,還寫(xiě)入重寫(xiě)緩沖區(qū)(aof_rewrite_buf)。

  4.子進(jìn)程通過(guò)內(nèi)存快照,,按照命令重寫(xiě)策略寫(xiě)入到新的AOF文件,。

  4.1子進(jìn)程寫(xiě)完新的AOF文件后,向主進(jìn)程發(fā)信號(hào),,父進(jìn)程更新統(tǒng)計(jì)信息,。

  4.2主進(jìn)程把AOFaof_rewrite_buf中的數(shù)據(jù)寫(xiě)入到新的AOF文件(避免寫(xiě)文件是數(shù)據(jù)丟失)。

  5.使用新的AOF文件覆蓋舊的AOF文件,,標(biāo)志AOF重寫(xiě)完成,。

AOF實(shí)現(xiàn)本質(zhì)

AOF實(shí)現(xiàn)本質(zhì)是基于redis通訊協(xié)議,,將命令以純文本的方式寫(xiě)入到文件中。

redis協(xié)議:

首先Redis是以行來(lái)劃分,,每行以\r\n行結(jié)束,。每一行都有一個(gè)消息頭,消息頭共分為5種分別如下:

(+) 表示一個(gè)正確的狀態(tài)信息,,具體信息是當(dāng)前行+后面的字符,。

(-)  表示一個(gè)錯(cuò)誤信息,具體信息是當(dāng)前行-后面的字符,。

(*) 表示消息體總共有多少行,,不包括當(dāng)前行,*后面是具體的行數(shù)。

($) 表示下一行數(shù)據(jù)長(zhǎng)度,,不包括換行符長(zhǎng)度\r\n,$后面則是對(duì)應(yīng)的長(zhǎng)度的數(shù)據(jù),。

(:) 表示返回一個(gè)數(shù)值,:后面是相應(yīng)的數(shù)字節(jié)符,。

我們可以直接查看AOF文件中的格式,,如下圖:

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

之前已經(jīng)提到當(dāng)AOF開(kāi)啟時(shí)候,redis數(shù)據(jù)恢復(fù)優(yōu)先選用AOF進(jìn)行數(shù)據(jù)恢復(fù),,以下使用停止redis來(lái)模擬redis故障,然后在重寫(xiě)啟動(dòng)進(jìn)行恢復(fù),。

查看日志會(huì)發(fā)現(xiàn)數(shù)據(jù)恢復(fù)已經(jīng)變成從AOF(append only file)文件中恢復(fù):

AOF配置參數(shù)

復(fù)制代碼
auto-aof-rewrite-min-size 64mb#AOF文件最小重寫(xiě)大小,只有當(dāng)AOF文件大小大于該值時(shí)候才可能重寫(xiě),4.0默認(rèn)配置64mb,。auto-aof-rewrite-percentage  100#當(dāng)前AOF文件大小和最后一次重寫(xiě)后的大小之間的比率等于或者等于指定的增長(zhǎng)百分比,,如100代表當(dāng)前AOF文件是上次重寫(xiě)的兩倍時(shí)候才重寫(xiě)。appendfsync everysec#no:不使用fsync方法同步,,而是交給操作系統(tǒng)write函數(shù)去執(zhí)行同步操作,,在linux操作系統(tǒng)中大約每30秒刷一次緩沖。這種情況下,,緩沖區(qū)數(shù)據(jù)同步不可控,,并且在大量的寫(xiě)操作下,aof_buf緩沖區(qū)會(huì)堆積會(huì)越來(lái)越嚴(yán)重,,一旦redis出現(xiàn)故障,,數(shù)據(jù)#always:表示每次有寫(xiě)操作都調(diào)用fsync方法強(qiáng)制內(nèi)核將數(shù)據(jù)寫(xiě)入到aof文件。這種情況下由于每次寫(xiě)命令都寫(xiě)到了文件中, 雖然數(shù)據(jù)比較安全,,但是因?yàn)槊看螌?xiě)操作都會(huì)同步到AOF文件中,,所以在性能上會(huì)有影響,同時(shí)由于頻繁的IO操作,,硬盤(pán)的使用壽命會(huì)降低,。#everysec:數(shù)據(jù)將使用調(diào)用操作系統(tǒng)write寫(xiě)入文件,并使用fsync每秒一次從內(nèi)核刷新到磁盤(pán),。 這是折中的方案,,兼顧性能和數(shù)據(jù)安全,所以redis默認(rèn)推薦使用該配置,。aof-load-truncated yes#當(dāng)redis突然運(yùn)行崩潰時(shí),,會(huì)出現(xiàn)aof文件被截?cái)嗟那闆r,Redis可以在發(fā)生這種情況時(shí)退出并加載錯(cuò)誤,,以下選項(xiàng)控制此行為,。
#如果aof-load-truncated設(shè)置為yes,則加載截?cái)嗟腁OF文件,,Redis服務(wù)器啟動(dòng)發(fā)出日志以通知用戶(hù)該事件,。#如果該選項(xiàng)設(shè)置為no,則服務(wù)將中止并顯示錯(cuò)誤并停止啟動(dòng),。當(dāng)該選項(xiàng)設(shè)置為no時(shí),,用戶(hù)需要在重啟之前使用“redis-check-aof”實(shí)用程序修復(fù)AOF文件在進(jìn)行啟動(dòng)。appendonly no 
#yes開(kāi)啟AOF,,no關(guān)閉AOFappendfilename appendonly.aof#指定AOF文件名,,4.0無(wú)法通過(guò)config set 設(shè)置,只能通過(guò)修改配置文件設(shè)置,。dir /etc/redis#RDB文件和AOF文件存放目錄
復(fù)制代碼

實(shí)踐

實(shí)踐操作這里使用手動(dòng)執(zhí)bgrewriteaof演示重寫(xiě),。

查看日志:

三、RDB-AOF混合持久化

簡(jiǎn)介

redis4.0相對(duì)與3.X版本其中一個(gè)比較大的變化是4.0添加了新的混合持久化方式,。前面已經(jīng)詳細(xì)介紹了AOF持久化以及RDB持久化,,這里介紹的混合持久化就是同時(shí)結(jié)合RDB持久化以及AOF持久化混合寫(xiě)入AOF文件。這樣做的好處是可以結(jié)合 rdb 和 aof 的優(yōu)點(diǎn), 快速加載同時(shí)避免丟失過(guò)多的數(shù)據(jù),,缺點(diǎn)是 aof 里面的 rdb 部分就是壓縮格式不再是 aof 格式,,可讀性差。

開(kāi)啟混合持久化

4.0版本的混合持久化默認(rèn)關(guān)閉的,,通過(guò)aof-use-rdb-preamble配置參數(shù)控制,,yes則表示開(kāi)啟,no表示禁用,,默認(rèn)是禁用的,,可通過(guò)config set修改。

混合持久化過(guò)程

了解了AOF持久化過(guò)程和RDB持久化過(guò)程以后,,混合持久化過(guò)程就相對(duì)簡(jiǎn)單了,。

混合持久化同樣也是通過(guò)bgrewriteaof完成的,不同的是當(dāng)開(kāi)啟混合持久化時(shí),,fork出的子進(jìn)程先將共享的內(nèi)存副本全量的以RDB方式寫(xiě)入aof文件,,然后在將重寫(xiě)緩沖區(qū)的增量命令以AOF方式寫(xiě)入到文件,寫(xiě)入完成后通知主進(jìn)程更新統(tǒng)計(jì)信息,,并將新的含有RDB格式和AOF格式的AOF文件替換舊的的AOF文件,。簡(jiǎn)單的說(shuō):新的AOF文件前半段是RDB格式的全量數(shù)據(jù)后半段是AOF格式的增量數(shù)據(jù),,如下圖:

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

當(dāng)我們開(kāi)啟了混合持久化時(shí),啟動(dòng)redis依然優(yōu)先加載aof文件,,aof文件加載可能有兩種情況如下:

  • aof文件開(kāi)頭是rdb的格式, 先加載 rdb內(nèi)容再加載剩余的 aof,。

  • aof文件開(kāi)頭不是rdb的格式,直接以aof格式加載整個(gè)文件,。

實(shí)踐 

 開(kāi)啟混合持久化,,并在開(kāi)啟后立馬執(zhí)行寫(xiě)操作,為了證實(shí)混合持久化的后半部分AOF過(guò)程

查看日志:

此時(shí)的aof文件已經(jīng)和只開(kāi)啟AOF持久化文件不一樣了,,上半部分是RDB持久化的數(shù)據(jù),,下半部分是AOF格式數(shù)據(jù)。

四,、優(yōu)缺點(diǎn) 

 RDB

優(yōu)點(diǎn):

  1. RDB 是一個(gè)非常緊湊(compact)的文件,,體積小,因此在傳輸速度上比較快,,因此適合災(zāi)難恢復(fù),。 

  2. RDB 可以最大化 Redis 的性能:父進(jìn)程在保存 RDB 文件時(shí)唯一要做的就是 fork 出一個(gè)子進(jìn)程,然后這個(gè)子進(jìn)程就會(huì)處理接下來(lái)的所有保存工作,,父進(jìn)程無(wú)須執(zhí)行任何磁盤(pán) I/O 操作,。

  3. RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比 AOF 的恢復(fù)速度要快。

缺點(diǎn):

  1. RDB是一個(gè)快照過(guò)程,,無(wú)法完整的保存所以數(shù)據(jù),,尤其在數(shù)據(jù)量比較大時(shí)候,一旦出現(xiàn)故障丟失的數(shù)據(jù)將更多,。

  2. 當(dāng)redis中數(shù)據(jù)集比較大時(shí)候,,RDB由于RDB方式需要對(duì)數(shù)據(jù)進(jìn)行完成拷貝并生成快照文件,fork的子進(jìn)程會(huì)耗CPU,,并且數(shù)據(jù)越大,,RDB快照生成會(huì)越耗時(shí)。

  3. RDB文件是特定的格式,,閱讀性差,,由于格式固定,可能存在不兼容情況,。

AOF 

優(yōu)點(diǎn):

  1. 數(shù)據(jù)更完整,,秒級(jí)數(shù)據(jù)丟失(取決于設(shè)置fsync策略)。

  2. 兼容性較高,,由于是基于redis通訊協(xié)議而形成的命令追加方式,,無(wú)論何種版本的redis都兼容,再者aof文件是明文的,,可閱讀性較好,。

缺點(diǎn):

  1. 數(shù)據(jù)文件體積較大,即使有重寫(xiě)機(jī)制,,但是在相同的數(shù)據(jù)集情況下,AOF文件通常比RDB文件大,。

  2. 相對(duì)RDB方式,,AOF速度慢于RDB,并且在數(shù)據(jù)量大時(shí)候,,恢復(fù)速度AOF速度也是慢于RDB。

  3. 由于頻繁地將命令同步到文件中,,AOF持久化對(duì)性能的影響相對(duì)RDB較大,,但是對(duì)于我們來(lái)說(shuō)是可以接受的。

混合持久化

優(yōu)點(diǎn):

  1. 混合持久化結(jié)合了RDB持久化 和 AOF 持久化的優(yōu)點(diǎn), 由于絕大部分都是RDB格式,,加載速度快,,同時(shí)結(jié)合AOF,增量的數(shù)據(jù)以AOF方式保存了,,數(shù)據(jù)更少的丟失,。

缺點(diǎn):

  1. 兼容性差,一旦開(kāi)啟了混合持久化,,在4.0之前版本都不識(shí)別該aof文件,,同時(shí)由于前部分是RDB格式,閱讀性較差

五,、相關(guān)命令

aof文件檢查

redis-check-aof /etc/redis/appendonly.aof

rdb文件檢查

redis-check-rdb /etc/redis/dump.rdb

查看持久化信息

info Persistence

查看狀態(tài)信息

info stats

以上是所有內(nèi)容,,希望對(duì)你有幫助~

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多