深入探索Redis持久化原理
創(chuàng)新互聯(lián)公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元福清做網(wǎng)站,已為上家服務(wù),為福清各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575Redis是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),為了保證數(shù)據(jù)的持久化,redis提供了兩種持久化方式RDB和AOF,
Redis是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),為了保證數(shù)據(jù)的持久化,redis提供了兩種持久化方式RDB和AOF,下面我們就分別來(lái)看下這兩種持久化方式的實(shí)現(xiàn)原理。
RDB是通過(guò)快照方式完成的,當(dāng)滿足一定條件時(shí),redis會(huì)自動(dòng)將內(nèi)存中的數(shù)據(jù)持久化到磁盤。
執(zhí)行主從復(fù)制操作(第一次)
###快照設(shè)置規(guī)則 save {多少秒內(nèi)} {數(shù)據(jù)變化了多少}
例如:save 100 1:在100秒內(nèi),至少有一個(gè)鍵被修改就進(jìn)行快照;save 200 4:在200秒內(nèi),至少4個(gè)鍵被修改就進(jìn)行快照。
默認(rèn)情況下,redis是沒(méi)有開(kāi)啟AOF(append only file)的。在開(kāi)始AOF之后,redis每接收到一條更改redis數(shù)據(jù)的命令,就會(huì)將該命令寫入硬盤中的AOF文件。很明顯,該過(guò)程會(huì)降低redis的性能,但大部分情況下是能夠接受的,同時(shí),使用性能較好的硬盤可以提高AOF性能
# 開(kāi)啟appendonly參數(shù)appendonly true# 設(shè)置AOF文件位置dir ./# 設(shè)置AOF文件名稱,默認(rèn)是appendonly.aofappendfilename appendonly.aof
Redis客戶端使用RESP協(xié)議與Redis服務(wù)端進(jìn)行通信,該協(xié)議是專門為redis設(shè)計(jì)的,但是也可以用于其他C-S項(xiàng)目。
redis通過(guò)將所有的寫入命令記錄到AOF文件中,來(lái)持久化數(shù)據(jù)。而將命令記錄到AOF文件的過(guò)程,可以分成三個(gè)階段:
redis將執(zhí)行完的命令,命令參數(shù),命令參數(shù)格個(gè)數(shù)等內(nèi)容發(fā)送到AOF程序。當(dāng)redis客戶端執(zhí)行命令的時(shí)候,通過(guò)連接,將協(xié)議文本發(fā)送到redis,redis接收到協(xié)議文本之后,根據(jù)內(nèi)容,選擇適當(dāng)?shù)拿詈瘮?shù),將協(xié)議文本轉(zhuǎn)換成Redis字符串對(duì)象,在命令函數(shù)執(zhí)行完成后,將命令參數(shù)發(fā)送到AOF程序。
AOF程序接收到命令參數(shù)之后,會(huì)將其從字符串對(duì)象轉(zhuǎn)換成協(xié)議內(nèi)容,再將協(xié)議內(nèi)容追加到AOF緩存中。AOF緩存是在redisServer結(jié)構(gòu)的aof_buf中,新的內(nèi)容會(huì)被追加到aof_buf末尾。aof_buf保持著所有未被寫入到AOF文件的協(xié)議文本。
將AOF緩存內(nèi)容寫入到AOF文件,并保持到磁盤。 當(dāng)服務(wù)器的常規(guī)函數(shù)被執(zhí)行,或者事件處理器被執(zhí)行的時(shí)候,flushAppendOnlyFile函數(shù)將會(huì)被執(zhí)行。會(huì)有以下兩個(gè)過(guò)程。
AOF一共有三種保存模式
Redis可以在AOF文件過(guò)大的時(shí)候,在后臺(tái)(子進(jìn)程)對(duì)AOF文件進(jìn)行重寫。重寫之后的新文件,包含恢復(fù)當(dāng)前數(shù)據(jù)集所需的最小命令集合。重寫,并不會(huì)對(duì)AOF文件進(jìn)行讀取和寫入,針對(duì)的是數(shù)據(jù)庫(kù)中的當(dāng)前鍵。
優(yōu)化前set s1 1set s1 2set s1 3優(yōu)化后set s1 3
AOF的重寫是通過(guò)子進(jìn)程實(shí)現(xiàn)的,因此,主線程是繼續(xù)工作的,有可能對(duì)新的數(shù)據(jù)進(jìn)行修改,有可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的數(shù)據(jù)和重寫之后的數(shù)據(jù)不一致。redis通過(guò)增加一個(gè)AOF重寫緩存來(lái)解決這個(gè)問(wèn)題,當(dāng)fork出子進(jìn)程之后,新的命令不僅會(huì)追加到現(xiàn)有的AOF文件中,還會(huì)添加一份數(shù)據(jù)到這個(gè)緩存當(dāng)中。
Redis創(chuàng)建新的AOF文件之后,會(huì)繼續(xù)將命令添加到原有的AOF文件中,即使數(shù)據(jù)庫(kù)突然宕機(jī)了,原有的AOF文件和文件內(nèi)容也不會(huì)有損失。而當(dāng)新的AOF文件創(chuàng)建完畢之后,會(huì)直接把舊的替換掉,往新的AOF文件中添加命令。
當(dāng)子進(jìn)程在進(jìn)行重寫時(shí),主進(jìn)程會(huì)完成下列工作
這樣程序就完成了新舊AOF文件的替換工作。而當(dāng)處理完成之后,主進(jìn)程就會(huì)繼續(xù)接受請(qǐng)求。整個(gè)重寫過(guò)程中只有最后的緩存寫入和改名替換的操作會(huì)導(dǎo)致主進(jìn)程阻塞,其他時(shí)候不會(huì)影響redis的正常工作,把AOF重寫對(duì)redis的性能影響降到最低。
優(yōu)化觸發(fā)條件
#當(dāng)前的AOF文件超過(guò)上次重寫時(shí)AOF文件大小百分幾的時(shí)候進(jìn)行重寫,如果沒(méi)有重寫過(guò),則以啟動(dòng)時(shí)AOF文件的大小為準(zhǔn)auto-aof-rewrite-percentage 100#限制允許重寫的最小的AOF文件,也就是文件小于這個(gè)值的時(shí)候不需要進(jìn)行重寫優(yōu)化auto-aof-rewrite-min-size 64mb
關(guān)于Redis持久化原理的相關(guān)介紹就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的參考價(jià)值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。