自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

面對(duì)Redis持久化連環(huán)Call,你還頂?shù)米幔?/h1>

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維 Redis
Redis是一個(gè)基于內(nèi)存的非關(guān)系型的數(shù)據(jù)庫(kù),數(shù)據(jù)保存在內(nèi)存中,但是內(nèi)存中的數(shù)據(jù)也容易發(fā)生丟失。這里Redis就為我們提供了持久化的機(jī)制,分別是RDB(Redis DataBase)和AOF(Append Only File)。

 本文腦圖

Redis是一個(gè)基于內(nèi)存的非關(guān)系型的數(shù)據(jù)庫(kù),數(shù)據(jù)保存在內(nèi)存中,但是內(nèi)存中的數(shù)據(jù)也容易發(fā)生丟失。這里Redis就為我們提供了持久化的機(jī)制,分別是RDB(Redis DataBase)和AOF(Append Only File)。

Redis在以前的版本中是單線程的,而在6.0后對(duì)Redis的io模型做了優(yōu)化,io Thread為多線程的,但是worker Thread仍然是單線程。

在Redis啟動(dòng)的時(shí)候就會(huì)去加載持久化的文件,如果沒有就直接啟動(dòng),在啟動(dòng)后的某一時(shí)刻會(huì)繼續(xù)持久化內(nèi)存中產(chǎn)生的數(shù)據(jù)。

接下來(lái)我們就來(lái)詳細(xì)了解Redis的兩種持久化機(jī)制RDB(Redis DataBase)和AOF(Append Only File)。

RDB持久化機(jī)制

什么是RDB持久化呢?RDB持久化就是將當(dāng)前進(jìn)程的數(shù)據(jù)以生成快照的形式持久化到磁盤中。對(duì)于快照的理解,我們可以理解為將當(dāng)前線程的數(shù)據(jù)以拍照的形式保存下來(lái)。

RDB持久化的時(shí)候會(huì)單獨(dú)fork一個(gè)與當(dāng)前進(jìn)程一摸一樣的子進(jìn)程來(lái)進(jìn)行持久化,因此RDB持久化有如下特點(diǎn):

  1.  開機(jī)恢復(fù)數(shù)據(jù)快。
  2.  寫入持久化文件快。

RDB的持久化也是Redis默認(rèn)的持久化機(jī)制,它會(huì)把內(nèi)存中的數(shù)據(jù)以快照的形式寫入默認(rèn)文件名為dump.rdb中保存。

在安裝后的Redis中,Redis的配置都在redis.conf文件中,如下圖所示,dbfilename就是配置RDB的持久化文件名。

持久化觸發(fā)時(shí)機(jī)

在RDB機(jī)制中觸發(fā)內(nèi)存中的數(shù)據(jù)進(jìn)行持久化,有以下三種方式:

(1)save命令:

save命令不會(huì)fork子進(jìn)程,通過(guò)阻塞當(dāng)前Redis服務(wù)器,直到RDB完成為止,所以該命令在生產(chǎn)中一般不會(huì)使用。save命令執(zhí)行原理圖如下:

在redis.conf的配置中dir的配置就是RDB持久化后生成rdb二進(jìn)制文件所在的位置,默認(rèn)的位置是./,表示當(dāng)前位置,哪里啟動(dòng)redis,就會(huì)在哪里生成持久化文件,如下圖所示:

下面我們進(jìn)行一下實(shí)操,演示一下二進(jìn)制文件生成的過(guò)程,在我本機(jī)的電腦虛擬機(jī)中,我所在的位置如下,該文件夾是新創(chuàng)建的redis的數(shù)據(jù)存儲(chǔ)文件夾。

然后我們直接在該位置啟動(dòng)我們的Redis服務(wù),啟動(dòng)的命令如下: 

  1. /root/redis-4.0.6/src/redis-server /root/redis-4.0.6/redis.conf 

接著通過(guò)該命令:ps -aux | grep redis,查看我們的redis服務(wù)是否正常啟動(dòng),若是顯示如下圖所示,則表示Redis是正常啟動(dòng)的:

正常啟動(dòng)后,直接登陸Redis,可以通過(guò)以下命令登陸Redis,如下圖所示:

因?yàn)楫?dāng)前中Redis是新安裝的,數(shù)據(jù)都是為空,什么都沒有,然后通過(guò)下圖的命令隨意向Redis中輸入幾條命令,最后執(zhí)行save命令,在該文件夾下就會(huì)出現(xiàn)dump.rdb持久化的數(shù)據(jù)文件。

當(dāng)然上面說(shuō)到,在新安裝的Redis中默認(rèn)的RDB數(shù)據(jù)持久化位置為./文件,一般我們會(huì)把它改成服務(wù)器自己的特定位置下,原理都是一樣的,可以自己進(jìn)行嘗試,這里不再進(jìn)行演示。

(2)bgsave命令:

bgsave命令會(huì)在后臺(tái)fork一個(gè)與Redis主線程一模一樣的子線程,由子線程負(fù)責(zé)內(nèi)存中的數(shù)據(jù)持久化。

這樣fork與主線程一樣的子線程消耗了內(nèi)存,但是不會(huì)阻塞主線程處理客戶端請(qǐng)求,是以空間換時(shí)間的方式快照內(nèi)存中的數(shù)據(jù)到到文件中。

bgsave命令阻塞只會(huì)發(fā)生在fork子線程的時(shí)候,這段時(shí)間發(fā)生的非常短,可以忽略不計(jì),如下圖是 bgsave執(zhí)行的流程圖:

 

 

上面說(shuō)到redis.conf中的dir配置是配置持久化文件生成的指定的目錄,dbfilename是配置生成的文件名,也可以通過(guò)命令行使用命令來(lái)動(dòng)態(tài)的設(shè)置這兩個(gè)配置,命令如下: 

  1. config set dir{newDir}  
  2. config set dbfilename{newFileName} 

(3)自動(dòng)化

除了上面在命令行使用save和bgsave命令觸發(fā)持久化,也可以在redis.conf配置文件中,完成配置,如下圖所示:

在新安裝的redis中由默認(rèn)的以上三個(gè)save配置,save 900 1表示900秒內(nèi)如果至少有1個(gè)key值變化,則進(jìn)行持久化保存數(shù)據(jù);

save 300 10則表示300秒內(nèi)如果至少有10個(gè)key值發(fā)生變化,則進(jìn)行持久化,save 60 10000以此類推。

通過(guò)以上的分析可以得出以下save和bgsave的對(duì)比區(qū)別:

  1.  save是同步持久化數(shù)據(jù),而bgsave是異步持久化數(shù)據(jù)。
  2.  save不會(huì)fork子進(jìn)程,通過(guò)主進(jìn)程持久化數(shù)據(jù),會(huì)阻塞處理客戶端的請(qǐng)求,而bdsave會(huì)fork子進(jìn)程持久化數(shù)據(jù),同時(shí)還可以處理客戶端請(qǐng)求,高效。
  3.  save不會(huì)消耗內(nèi)存,而bgsave會(huì)消耗內(nèi)存。

RDB的優(yōu)缺點(diǎn)

缺點(diǎn): RDB持久化后的文件是緊湊的二進(jìn)制文件,適合于備份、全量復(fù)制、大規(guī)模數(shù)據(jù)恢復(fù)的場(chǎng)景,對(duì)數(shù)據(jù)完整性和一致性要求不高,RDB會(huì)丟失最后一次快照的數(shù)據(jù)。

優(yōu)點(diǎn): 開機(jī)的恢復(fù)數(shù)據(jù)快,寫入持久化文件快。

AOF持久化機(jī)制

AOF持久化機(jī)制是以日志的形式記錄Redis中的每一次的增刪改操作,不會(huì)記錄查詢操作,以文本的形式記錄,打開記錄的日志文件就可以查看操作記錄。

AOF是默認(rèn)不開啟的,若是想開啟AOF,在如下圖的配置修改即可:

只需要把a(bǔ)ppendonly no修改為appendonly yes即可開啟,在AOF中通過(guò)appendfilename配置生成的文件名,該文件名默認(rèn)為appendonly.aof,路徑也是通過(guò)dir配置的,這個(gè)與RDB的一樣,具體的配置信息如下圖所示:

AOF觸發(fā)機(jī)制

AOF帶來(lái)的持久化更加安全可靠,默認(rèn)提供三種觸發(fā)機(jī)制,如下所示:

  1.  no:表示等操作系統(tǒng)等數(shù)據(jù)緩存同步到磁盤中(快、持久化沒保證)。
  2.  always:同步持久化,每次發(fā)生數(shù)據(jù)變更時(shí),就會(huì)立即記錄到磁盤中(慢,安全)。
  3.  everysec:表示每秒同步一次(默認(rèn)值,很快,但是會(huì)丟失一秒內(nèi)的數(shù)據(jù))。

AOF中每秒同步也是異步完成的,效率是非常高的,由于該機(jī)制對(duì)日志文件的寫入操作是采用append的形式。

因此在寫入的過(guò)程即使宕機(jī),也不會(huì)丟失已經(jīng)存入日志文件的數(shù)據(jù),數(shù)據(jù)的完整性是非常高的。

在新安裝的Redis的配置文件中,AOF的配置如下所示:

AOF重寫機(jī)制

但是,在寫入所有的操作到日志文件中時(shí),就會(huì)出現(xiàn)日志文件很多重復(fù)的操作,甚至是無(wú)效的操作,導(dǎo)致日志文件越來(lái)越大。

所謂的無(wú)效的的操作,舉個(gè)例子,比如某一時(shí)刻對(duì)一個(gè)k++,然后后面的某一時(shí)刻k--,這樣k的值是保持不變的,那么這兩次的操作就是無(wú)效的。

如果像這樣的無(wú)效操作很多,記錄的文件臃腫,就浪費(fèi)了資源空間,所以在Redis中出現(xiàn)了rewrite機(jī)制。

redis提供了bgrewriteaof命令。將內(nèi)存中的數(shù)據(jù)以命令的方式保存到臨時(shí)文件中,同時(shí)會(huì)fork出一條新進(jìn)程來(lái)將文件重寫。

重寫AOF的日志文件不是讀取舊的日志文件瘦身,而是將內(nèi)存中的數(shù)據(jù)用命令的方式重寫一個(gè)AOF文件,重新保存替換原來(lái)舊的日志文件,因此內(nèi)存中的數(shù)據(jù)才是最新的。

重寫操作也會(huì)fork一個(gè)子進(jìn)程來(lái)處理重寫操作,重寫以內(nèi)存中的數(shù)據(jù)作為重寫的源,避免了操作的冗余性,保證了數(shù)據(jù)的最新。

在Redis以append的形式將修改的數(shù)據(jù)寫入老的磁盤中    ,同時(shí)Redis也會(huì)創(chuàng)建一個(gè)新的文件用于記錄此期間有哪些命令被執(zhí)行。

下面進(jìn)行演示一下AOF的操作,首先先打開AOF機(jī)制,修改配置文件中的appendonly no為appendonly yes,然后執(zhí)行如下圖的操作:

都顯示執(zhí)行成功,ls以下查看此時(shí)當(dāng)前的文件夾終究會(huì)出現(xiàn)appendonly.aof

,AOF的數(shù)據(jù)持久化文件,通過(guò)cat命令查看內(nèi)容:

從上面的存儲(chǔ)的文件中可以看出,每一個(gè)命令是非常有規(guī)律的,比如第一次執(zhí)行key *映射到該配置文件中的命令如下: 

  1. *2 //表示該命令兩組key 為一組 * 為一組  
  2. $6 //表示SELECT有6字符  
  3. SELECT  
  4. $1 //表示下面的0一個(gè)字符  

然后執(zhí)行set k1 1的命令,此命令映射到文件中的命令如下: 

  1. *3 //表示該命令有三組set為一組 k1為一組 1為一組  
  2. $3 // 表示set有三個(gè)字符  
  3. set // 表示執(zhí)行了set命令  
  4. $2 // 表示k1有兩個(gè)字符  
  5. k1 // key值  
  6. $1 // 便是value值的字符長(zhǎng)度為1  
  7. 1  // value值 

當(dāng)AOF的日志文件增長(zhǎng)到一定大小的時(shí)候Redis就能夠bgrewriteaof對(duì)日志文件進(jìn)行重寫瘦身。當(dāng)AOF配置文件大于改配置項(xiàng)時(shí)自動(dòng)開啟重寫(這里指超過(guò)原大小的100%)。

該配置可以通過(guò)如下的配置項(xiàng)進(jìn)行配置:

AOF的優(yōu)缺點(diǎn)

優(yōu)點(diǎn): AOF更好保證數(shù)據(jù)不會(huì)被丟失,最多只丟失一秒內(nèi)的數(shù)據(jù),通過(guò)fork一個(gè)子進(jìn)程處理持久化操作,保證了主進(jìn)程不會(huì)進(jìn)程io操作,能高效的處理客戶端的請(qǐng)求。

另外重寫操作保證了數(shù)據(jù)的有效性,即使日志文件過(guò)大也會(huì)進(jìn)行重寫。

AOF的日志文件的記錄可讀性非常的高,即使某一時(shí)刻有人執(zhí)行flushall清空了所有數(shù)據(jù),只需要拿到aof的日志文件,然后把最后一條的flushall給刪除掉,就可以恢復(fù)數(shù)據(jù)。

缺點(diǎn):  對(duì)于相同數(shù)量的數(shù)據(jù)集而言,AOF文件通常要大于RDB文件。RDB 在恢復(fù)大數(shù)據(jù)集時(shí)的速度比 AOF 的恢復(fù)速度要快。AOF在運(yùn)行效率上往往會(huì)慢于RDB。

混合持久化

在redis4.0后混合持久化(RDB+AOF)對(duì)重寫的優(yōu)化,4.0版本的混合持久化默認(rèn)是關(guān)閉的,可以通過(guò)以下的配置開啟混合持久化:

混合持久化也是通過(guò)bgrewriteaof來(lái)完成的,不同的是當(dāng)開啟混合持久化時(shí),fork出的子進(jìn)程先將共享內(nèi)存的數(shù)據(jù)以RDB方式寫入aof文件中,然后再將重寫緩沖區(qū)的增量命令以AOF方式寫入文件中。

寫入完成后通知主進(jìn)程統(tǒng)計(jì)信息,并將新的含有RDB格式和AOF格式的AOF文件替換舊的AOF文件。簡(jiǎn)單的說(shuō):新的AOF文件前半段是以RDB格式的全量數(shù)據(jù)后半段是AOF格式的增量數(shù)據(jù)。

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

RDB和AOF優(yōu)勢(shì)和劣勢(shì)

rdb適合大規(guī)模的數(shù)據(jù)恢復(fù),由于rdb是以快照的形式持久化數(shù)據(jù),恢復(fù)的數(shù)據(jù)快,在一定的時(shí)間備份一次,而aof的保證數(shù)據(jù)更加完整,損失的數(shù)據(jù)只在秒內(nèi)。

具體哪種更適合生產(chǎn),在官方的建議中兩種持久化機(jī)制同時(shí)開啟,如果兩種機(jī)制同時(shí)開啟,優(yōu)先使用aof持久化機(jī)制。 

 

責(zé)任編輯:龐桂玉 來(lái)源: 數(shù)據(jù)庫(kù)開發(fā)
相關(guān)推薦

2012-04-11 11:36:08

帶寬提速千兆路由器

2020-12-09 18:22:00

微前端微服務(wù)前端

2023-06-07 15:29:33

MySQL事務(wù)面試

2021-01-20 15:19:32

Google 開源數(shù)據(jù)集

2021-09-02 09:53:42

開發(fā)Redis配置

2021-03-09 12:25:08

區(qū)塊鏈資金比特幣

2021-09-01 09:44:16

Redis持久化配置

2018-07-01 16:00:20

2022-01-13 15:31:14

Redis持久化配置

2017-11-02 16:03:12

2023-10-12 13:01:29

Redis數(shù)據(jù)庫(kù)

2020-03-03 14:15:49

Redis持久化數(shù)據(jù)庫(kù)

2011-12-08 15:37:52

信息安全威脅

2024-05-28 10:08:05

2024-03-26 00:03:08

Redis數(shù)據(jù)RDB

2021-02-25 23:40:26

Redis集群架構(gòu)

2024-01-22 10:07:48

Redis持久化功能緩存擊穿

2024-12-20 12:15:06

RedisRDB持久化

2020-02-18 16:14:33

RedisRDBAOF

2021-10-04 21:11:18

Redis混合持久化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)