一文詳細(xì)介紹Redis7持久化機(jī)制RDB和AOF
持久化方式
Redis提供了兩種數(shù)據(jù)持久化的方式,分別為RDB和AOF,RDB是基于內(nèi)存快照的,它會(huì)將某一時(shí)刻Redis的內(nèi)存狀態(tài)寫入磁盤,RDB也是Redis默認(rèn)采用的持久化方式,AOF則是基于文件追加的機(jī)制來進(jìn)行持久化的,如果我們開啟AOF持久化,那么每寫入一條數(shù)據(jù),這個(gè)寫入數(shù)據(jù)的命令就會(huì)被追加到AOF文件的尾部,下面詳細(xì)介紹這兩種持久化方式。
RDB持久化
RDB是Redis默認(rèn)的持久化方式,它是基于內(nèi)存快照的持久化方式,何為快照?快照就是某一時(shí)刻Redis內(nèi)存中的所有數(shù)據(jù),就好比我們使用WPS編寫文檔,突然有事情需要處理,這時(shí)候我們要將電腦關(guān)閉,為了不讓編輯的內(nèi)容丟失,我們關(guān)閉WPS時(shí)它會(huì)提醒保存文檔,這時(shí)候就會(huì)把到我們最后一刻操作之前的所有數(shù)據(jù)都保存下來,下次打開的時(shí)候 ,我們可以從上次編輯的地方繼續(xù)。
RDB配置
我們關(guān)注以下三個(gè)配置就行
save 3600 1 300 100 10 10000 dbfilename dump.rdb dir ./
save
配置達(dá)到什么條件才保存內(nèi)存快照,這個(gè)配置表示如果在3600秒內(nèi)進(jìn)行一次寫操作,或者在300秒內(nèi)進(jìn)行100次寫操作,又在10秒內(nèi)進(jìn)行10000次寫操作,那么就會(huì)保存內(nèi)存快照。
dbfilename
表示生成的RDB二進(jìn)制文件名,默認(rèn)為dump.db
,dir ./
是生成的RDB二進(jìn)制文件的存放路勁。
當(dāng)上面的save中的條件觸發(fā),那么Redis就會(huì)保存內(nèi)存快照,當(dāng)然,我們也可以直接使用SAVE
和BGSAVE
命令來保存內(nèi)存快照,save這里的配置到最后還是去執(zhí)行SAVE
和BGSAVE
命令,下面介紹SAVE
和BGSAVE
命令。
SAVE和BGSAVE命令
在Redis命令行執(zhí)行SAVE命令或者BGSAVE命令都可能保存快照,只不過SAVE命令會(huì)阻塞Redis服務(wù)器,這時(shí)候客戶端發(fā)送的所有請(qǐng)求Redis都會(huì)拒絕,如果RDB文件比較小的還好,如果比較大,那么恢復(fù)數(shù)據(jù)就需要花費(fèi)一定的時(shí)間,對(duì)于客戶端來就很不友好,所以這時(shí)候我們可以使用BGSAVE命令,執(zhí)行BGSAVE命令,Redis會(huì)fork一個(gè)子進(jìn)程去保存內(nèi)存快照,這樣Redis服務(wù)器就不會(huì)阻塞。
下面我們對(duì)配置進(jìn)行修改來測試rdb。
改成下面配置,那么10s內(nèi)如果有1次寫操作,就會(huì)保存當(dāng)前快照。
save 3600 1 300 100 10 1
我們往Redis中添加一個(gè)key后,后臺(tái)就會(huì)打印保存到磁盤的日志。
在Redis源碼中,保存RDB文件在rdb.c文件中,使用rdbSaveBackgroup
函數(shù)保存RDB文件,里面會(huì)fork一個(gè)子進(jìn)程,然后調(diào)用rdbSave
保存rdb文件。
恢復(fù)RDB文件
如果Redis服務(wù)發(fā)生宕機(jī),那么在服務(wù)器恢復(fù)后,Redis會(huì)加載rdb文件進(jìn)行恢復(fù),Redis沒有專門恢復(fù)rdb文件的命令,服務(wù)器在啟動(dòng)后會(huì)直接判斷是否存在rdb文件,如果存在則進(jìn)行恢復(fù)。
在redis中,在rdb.c文件中使用rdbLoad
函數(shù)進(jìn)行加載rdb文件和恢復(fù)到Redis內(nèi)存中。
AOF持久化
AOF (Append Only File)持久化機(jī)制會(huì)記錄每一條寫入 Redis 數(shù)據(jù)庫的命令,將其追加到文件末尾中,以此來保證數(shù)據(jù)的持久化和安全性。AOF 持久化方式保證了Redis的每一次寫的操作都可以被記錄到文件中,增加了數(shù)據(jù)的可靠性和穩(wěn)定性。這種方式下,每個(gè)寫入命令都將同步到 AOF 文件中。 AOF 優(yōu)先于 RBD 進(jìn)行持久化,如果 Redis 服務(wù)重啟之前啟用了 AOF 持久化方式,那么 Redis 會(huì)自動(dòng)從 AOF 日志文件中重建數(shù)據(jù)。 AOF 產(chǎn)生的日志文件是一個(gè)文本文件,易于查看,但也可能稍微耗時(shí)一些。
AOF配置
我們來關(guān)注AOF的幾個(gè)配置
appendonly yes appendfilename "appendonly.aof" appenddirname "appendonlydir" appendfsync everysec
appendonly
表示是否開啟AOF持久化機(jī)制,默認(rèn)為no,表示不開啟,Redis默認(rèn)不開啟AOF持久化,所以如果我們需要開啟AOF持久化,那么就需要將其設(shè)置為yes。
appendfilename
表示aof文件的名稱,開啟aof持久化,每個(gè)寫操作的命令會(huì)被寫入aof文件中,redis7以后,不單單生成了appendonly.aof文件,而是生成了三個(gè)文件,
appenddirname
表示aof所在文件夾的名稱,默認(rèn)為appendonlydir。
appendfsync
表示設(shè)置同步aof文件的時(shí)機(jī),當(dāng)我們?cè)O(shè)置了aof持久化機(jī)制,寫入的命令并不會(huì)直接寫入磁盤中的aof文件,而是保存在內(nèi)存的一個(gè)緩沖區(qū)aof_buf中,然后再通過相應(yīng)的機(jī)制刷盤到磁盤中,提供了 always,everysec,no 三種選項(xiàng)
always:每當(dāng)向緩沖區(qū)文件中添加數(shù)據(jù)時(shí),立即執(zhí)行同步操作將緩沖區(qū)的內(nèi)容同步到aof文件中。這樣可以保證數(shù)據(jù)的完整性,但會(huì)導(dǎo)致 Redis 性能下降。
everysec:每秒將aof緩沖區(qū)中的數(shù)據(jù)同步到磁盤。這種方式既保證了數(shù)據(jù)的完整性,又可以大大提高 Redis 的性能。
no:不執(zhí)行同步操作,而是交由操作系統(tǒng)控制同步時(shí)機(jī)。這種方案性能最好,但也有可能會(huì)導(dǎo)致數(shù)據(jù)丟失。
測試AOF持久化機(jī)制
開啟了AOF持久化機(jī)制后,我們往Redis中寫入幾條數(shù)據(jù),然后查看aof文件。
往Redis中寫入了一個(gè)名為 steakliu 的key,value為空,然后為steakliu這個(gè)key設(shè)置value為 steakliu is a handsome boy,這是兩個(gè)命令,我們查看aof文件,發(fā)現(xiàn)里面有這兩條命令,里面還有一個(gè) SELECT 0
,它是Redis自動(dòng)加入的。
在Redis中有一個(gè)時(shí)間循環(huán)機(jī)制,它會(huì)接受來自客戶端的請(qǐng)求,然后進(jìn)行處理,當(dāng)然也包括將命令寫入aof文件中,最終會(huì)調(diào)用flushAppendOnlyFile
函數(shù)。
上面代碼中我們看到里面有一個(gè)aof_buf,它的類型是sds,在Redis中sds名為簡單動(dòng)態(tài)字符串(Simple Dynamic String)。
sds aof_buf; /* AOF buffer, written before entering the event loop */
上面的配置中我們說了appendfsync
,它的作用就是將aof_buf緩沖區(qū)中的數(shù)據(jù)同步到aof文件中。
通過AOF恢復(fù)數(shù)據(jù)
將Redis進(jìn)程kill掉,然后重新啟動(dòng)Redis,我們看出它會(huì)去加載aof文件進(jìn)行數(shù)據(jù)恢復(fù)。
因?yàn)閍of文件中保存的是寫操作的命令,所以在進(jìn)行恢復(fù)的時(shí)候就是重新執(zhí)行一下這些命令就能進(jìn)行恢復(fù)。
AOF重寫
隨著aof文件的變大,如果我們的Redis服務(wù)出現(xiàn)故障后重啟,它使用aof來恢復(fù)數(shù)據(jù)時(shí),就會(huì)比較耗時(shí),如果里面存在大量重復(fù)的命令,比如下面我們對(duì)steak-key進(jìn)行反復(fù)的修改,但是實(shí)際上我們只需要最新的value,而里面出現(xiàn)了大量的重復(fù),就會(huì)導(dǎo)致恢復(fù)時(shí)間比較慢。
為了解決這個(gè)問題,Redis提供了aof重寫機(jī)制,它使用了BGREWEITEAOF命令來對(duì)aof文件進(jìn)行重寫,Redis會(huì)開啟一個(gè)子進(jìn)程來進(jìn)行重寫,它會(huì)編輯aof文件中命令,去除重復(fù)的,然后轉(zhuǎn)換到一個(gè)新的aof文件中。
循環(huán)添加重復(fù)的key
如下,我們往redis中循環(huán)添加兩個(gè)重復(fù)的key,分別是steak-key
和steak-pai
。
我們觀察一下aof文件夾中的幾個(gè)aof文件如下。
稍等一會(huì)兒,我們?cè)倏碼of文件夾下面的這幾個(gè)aof文件如下:
從上面我們可以看出,appendonly.aof.1.base.aof
變?yōu)榱?code>appendonly.aof.2.base.aof,appendonly.aof.1.incr.aof
變?yōu)榱?code>appendonly.aof.2.incr.aof,由此可見aof文件發(fā)生了重寫。
我們查看appendonly.aof.2.base.aof
的內(nèi)容如下:
我們發(fā)現(xiàn)這個(gè)文件夾中只有兩個(gè)key,也就是steak-key
和steak-pai
,如果不進(jìn)行重寫,那么就會(huì)存在大量重復(fù)的key,在進(jìn)行恢復(fù)的時(shí)候就比較慢。
注:上面我們并沒有開啟RDB和AOF混合使用,所以我們能看到明文,如果開啟了RDB和AOF混合使用,文件中則有RDB二進(jìn)制數(shù)據(jù)和AOF內(nèi)容,我使用的是Redis7版本,默認(rèn)是開啟RDB和AOF混合使用,可以在redis.conf中進(jìn)行配置。
aof-use-rdb-preamble yes
yes表示開啟RDB和AOF混合使用,no表示關(guān)閉,Redis7默認(rèn)的是開啟。
redis.conf配置
redis中有兩個(gè)aof重寫的配置。
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage 表示當(dāng) AOF 文件大小增長到上一次重寫文件時(shí)的大小的百分之多少時(shí),Redis 就會(huì)自動(dòng)觸發(fā) AOF 重寫。例如,當(dāng)此配置項(xiàng)為 100 時(shí),表示當(dāng) AOF 文件大小增長到上次重寫時(shí)大小的兩倍時(shí),就會(huì)自動(dòng)觸發(fā) AOF 重寫。
auto-aof-rewrite-min-size 表示 Redis 在自動(dòng)觸發(fā) AOF 重寫時(shí)設(shè)置的 AOF 文件最小大小限制。例如,當(dāng)此配置項(xiàng)為 64MB 時(shí),如果 AOF 文件大小增長到達(dá)了觸發(fā)自動(dòng)重寫的條件,但當(dāng)前 AOF 文件大小還不到 64MB,則不會(huì)自動(dòng)觸發(fā) AOF 重寫。
從上面我們可以看出,aof如果不進(jìn)行重寫,那么如果出現(xiàn)大量的重復(fù)key,aof文件中就會(huì)保存了大量重復(fù)的命令,在進(jìn)行aof恢復(fù)的時(shí)候,會(huì)做很多無用功
。
AOF和RDB優(yōu)缺點(diǎn)比較
RDB的優(yōu)點(diǎn)
RDB是一種快速而有效的備份方式,可以在特定的時(shí)間間隔內(nèi)保存Redis數(shù)據(jù)的快照,儲(chǔ)存快照文件的方式是寫入硬盤中的二進(jìn)制文件,所以很適合用來備份關(guān)鍵數(shù)據(jù),RDB備份是二進(jìn)制格式,所以比較小,使用起來比較節(jié)省存儲(chǔ)空間。RDB還支持壓縮備份,可以在備份數(shù)據(jù)時(shí)壓縮文件大小,節(jié)省備份成本。
RDB的缺點(diǎn)
RDB在執(zhí)行快照的時(shí)候,如果數(shù)據(jù)量較大,會(huì)造成Redis阻塞,如果服務(wù)器宕機(jī),比如發(fā)生異常關(guān)機(jī),那么這部分?jǐn)?shù)據(jù)就可能發(fā)生丟失,因?yàn)镽DB是定期進(jìn)行備份,如果Redis服務(wù)器發(fā)生故障,那么會(huì)丟失上次備份到現(xiàn)在的數(shù)據(jù)。
AOF的優(yōu)點(diǎn)
AOF是一種以日志的形式來記錄Redis服務(wù)器所執(zhí)行的所有寫入操作,具有很好的復(fù)原能力,因此更適合于重要數(shù)據(jù)的保存,AOF支持在重寫,以保證AOF文件不會(huì)無限增大導(dǎo)致讀取緩慢。
AOF的缺點(diǎn)AOF文件通常比RDB文件大,如果日志分析不當(dāng),則可能增加服務(wù)器I/O的負(fù)載,AOF方式的數(shù)據(jù)恢復(fù)速度通常比RDB方式的恢復(fù)速度慢,因?yàn)樗€需要去一個(gè)一個(gè)地執(zhí)行命令進(jìn)行恢復(fù)。
AOF和RDB混合使用
AOF和RDB可以混合使用,上面我們也提到了RDB和AOF混合使用可通過aof-use-rdb-preamble配置,Redis7默認(rèn)是開啟混合持久化的,那么就會(huì)將RDB二進(jìn)制內(nèi)容和AOF增量內(nèi)容保存在一起。
關(guān)于Redis的持久化機(jī)制,我們就分享到這里!
以上就是一文詳細(xì)介紹Redis7持久化機(jī)制RDB和AOF的詳細(xì)內(nèi)容,更多關(guān)于Redis7 RDB和AOF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis中管道操作pipeline的實(shí)現(xiàn)
RedisPipeline是一種優(yōu)化客戶端與服務(wù)器通信的技術(shù),通過批量發(fā)送和接收命令減少網(wǎng)絡(luò)往返次數(shù),提高命令執(zhí)行效率,本文就來介紹一下Redis中管道操作pipeline的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03Redis實(shí)現(xiàn)用戶關(guān)注的項(xiàng)目實(shí)踐
本文主要介紹了Redis實(shí)現(xiàn)用戶關(guān)注的項(xiàng)目實(shí)踐,通過使用Redis的set數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)關(guān)注對(duì)象,方便高效地進(jìn)行添加和取消關(guān)注操作,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Redis數(shù)據(jù)結(jié)構(gòu)之intset整數(shù)集合使用學(xué)習(xí)
這篇文章主要為大家介紹了Redis數(shù)據(jù)結(jié)構(gòu)之整數(shù)集合使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07淺談redis五大數(shù)據(jù)結(jié)構(gòu)和使用場景
這篇文章主要介紹了淺談redis五大數(shù)據(jù)結(jié)構(gòu)和使用場景,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04MyBatis緩存和二級(jí)緩存整合Redis的解決方案
這篇文章主要介紹了MyBatis緩存和二級(jí)緩存整合Redis,將MyBatis緩存和二級(jí)緩存整合Redis,可以提高查詢效率,同時(shí)也能保證數(shù)據(jù)的可靠性和一致性,需要的朋友可以參考下2023-07-07Redis和數(shù)據(jù)庫 數(shù)據(jù)同步問題的解決
這篇文章主要介紹了Redis和數(shù)據(jù)庫 數(shù)據(jù)同步問題的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01