Redis數(shù)據(jù)持久化方式技術(shù)解析
RDB(Redis DataBases)
1、RDB是什么:
在指定的時(shí)間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫(xiě)入磁盤(pán),也就是Snapshot快照,它恢復(fù)時(shí)是將快照文件直接讀到內(nèi)存里。
Redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來(lái)進(jìn)行持久化,會(huì)將數(shù)據(jù)寫(xiě)入到一個(gè)臨時(shí)文件中,持久化過(guò)程都結(jié)束了,再用這個(gè)臨時(shí)文件替換上次持久化好的文件。整個(gè)過(guò)程中,主進(jìn)程是不進(jìn)行任何IO操作的,這就確保了極高的性能,如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù),且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那RDB方式是要比AOF方式更加的高效。RDB的缺點(diǎn)是最后一次持久化后的數(shù)據(jù)可能丟失。
2、Fork的作用:
Fork的作用是復(fù)制一個(gè)與當(dāng)前進(jìn)程一樣的進(jìn)程。新進(jìn)程的所有數(shù)據(jù)(變量、環(huán)境變量、程序計(jì)數(shù)器等)數(shù)值都和原進(jìn)程一致,但是是一個(gè)全新的進(jìn)程,并作為原進(jìn)程的子進(jìn)程。
3、Rdb保存的是dump.rdb文件。
4、如何觸發(fā)RDB快照
(1)配置文件中默認(rèn)的快照配置:冷拷貝后重新使用(可以cp dump.rdb dump_new.rdb)。
(2)命令save或者bgsave:Save,只管保存其他不管,全部阻塞;bgsave,redis會(huì)在后臺(tái)異步進(jìn)行快照操作,快照同時(shí)還可以響應(yīng)客戶端請(qǐng)求??梢酝ㄟ^(guò)lastsave命令獲取最后一次成功執(zhí)行快照的時(shí)間。
(3)執(zhí)行flushall命令,也會(huì)產(chǎn)生dump.rdb文件,但里面是空的,無(wú)意義。
5、如何恢復(fù): 將備份文件(dump.rdb)移動(dòng)到redis安裝目錄并啟動(dòng)服務(wù)即可。
6、優(yōu)勢(shì):適合大規(guī)模的數(shù)據(jù)恢復(fù);對(duì)數(shù)據(jù)完整性和一致性要求不高。
7、劣勢(shì):在一定間隔時(shí)間做一次備份,所以如果redis意外down掉的話,就會(huì)丟失最后一次快照后的所有修改。Fork的時(shí)候,內(nèi)存中的數(shù)據(jù)被克隆了一份,大致2倍的膨脹性需要考慮。
8、如何停止:動(dòng)態(tài)所有停止RDB保存規(guī)則的方法:redis-cli config set save “”
總結(jié)

1、RDB是一個(gè)非常緊湊的文件。
2、RDB在保存RDB文件時(shí)父進(jìn)程唯一需要做的就是fork出一個(gè)子進(jìn)程,接下來(lái)的工作全部由子進(jìn)程來(lái)做,父進(jìn)程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能。
3、與AOF相比,再恢復(fù)大的數(shù)據(jù)集的時(shí)候,RDB方式會(huì)更快一些。
4、數(shù)據(jù)丟失風(fēng)險(xiǎn)大。
5、RDB需要經(jīng)常fork子進(jìn)程來(lái)保存數(shù)據(jù)集到硬盤(pán)上,當(dāng)數(shù)據(jù)集比較大的時(shí)候,fork的過(guò)程是非常耗時(shí)的,可能會(huì)導(dǎo)致Redis在一些毫秒級(jí)不能響應(yīng)客戶端請(qǐng)求。
AOF(Append Only File)
1、AOF是什么:以日志的形式來(lái)記錄每個(gè)寫(xiě)操作,將Redis執(zhí)行過(guò)的所有寫(xiě)指令記錄下來(lái)(讀操作不記錄),只許追加文件但不可以改寫(xiě)文件,redis啟動(dòng)之初會(huì)讀取該文件重新構(gòu)建數(shù)據(jù),換言之,redis重啟的話就根據(jù)日志文件的內(nèi)容將寫(xiě)指令從前到后執(zhí)行一次以完成數(shù)據(jù)的恢復(fù)工作。
2、rewrite是什么:AOF采用文件追加的方式,文件會(huì)越來(lái)越大為避免出現(xiàn)此種情況,新增了重寫(xiě)機(jī)制,當(dāng)AOF文件的大小超過(guò)所設(shè)定的閾值時(shí),Redis就會(huì)啟動(dòng)AOF文件的內(nèi)容壓縮,只保留可以恢復(fù)數(shù)據(jù)的最小指令集,可以使用命令bgrewriteaof。
3、重寫(xiě)原理:AOF文件持續(xù)增長(zhǎng)而過(guò)大時(shí),會(huì)fork出一條新進(jìn)程來(lái)將文件重寫(xiě)(也是先寫(xiě)臨時(shí)文件最后再rename),遍歷新進(jìn)程的內(nèi)存中數(shù)據(jù),每條記錄有一條的set語(yǔ)句。重寫(xiě)aof文件的操作,并沒(méi)有讀取舊的aof文件,而是將整個(gè)內(nèi)存中的數(shù)據(jù)庫(kù)內(nèi)容用命令的方式重寫(xiě)了一個(gè)新的aof文件,這點(diǎn)和快照點(diǎn)數(shù)類似。
4、重寫(xiě)的觸發(fā)機(jī)制:Redis會(huì)記錄上次重寫(xiě)時(shí)AOF的大小,默認(rèn)配置時(shí)當(dāng)AOF文件大小是上次rewrite后大小的一倍且文件大于64MB時(shí)觸發(fā)。
5、優(yōu)勢(shì):
(1)每秒同步:appendfsync always同步持久化每次發(fā)生數(shù)據(jù)變更會(huì)被立即記錄到磁盤(pán),性能較差但數(shù)據(jù)完整性比較好。
(2)每次修改同步:appendfsync everysec 異步操作,每秒記錄如果一秒內(nèi)宕機(jī),有數(shù)據(jù)丟失。
(3)不同步:appendfsync no 從不同步。
6、劣勢(shì):
(1)相同數(shù)據(jù)集的數(shù)據(jù)而言aof文件要遠(yuǎn)大于rdb文件,恢復(fù)速度慢于rdb。
(2)AOF運(yùn)行效率要慢于rdb,每秒同步策略效率較好,不同步效率和rdb相同。
總結(jié)

1、AOF文件是一個(gè)只進(jìn)行追加的日志文件。
2、Redis可以再AOF文件體積變得過(guò)大時(shí),自動(dòng)地在后臺(tái)對(duì)AOF進(jìn)行重寫(xiě)。
3、AOF文件有序地保存了對(duì)數(shù)據(jù)庫(kù)執(zhí)行的所有寫(xiě)入操作,這些寫(xiě)入操作以Redis協(xié)議的格式保存,因此AOF文件的內(nèi)容非常容易被人讀懂,對(duì)文件進(jìn)行分析也很輕松。
4、對(duì)于相同的數(shù)據(jù)集來(lái)說(shuō),AOF文件的體積通常要大于RDB文件的體積。
5、根據(jù)所使用的fsync策略,AOF的速度可能會(huì)慢于RDB。
兩種方式的總結(jié)
1、RDB持久化方式能夠在指定的時(shí)間間隔能對(duì)你的數(shù)據(jù)進(jìn)行快照存儲(chǔ)。
2、AOF持久化方式記錄每次對(duì)服務(wù)器寫(xiě)的操作,當(dāng)服務(wù)器重啟的時(shí)候會(huì)重新執(zhí)行這些命令來(lái)恢復(fù)原始的數(shù)據(jù),AOF文件進(jìn)行后臺(tái)重寫(xiě),使得AOF文件的體積不至于過(guò)大。
3、只做緩存:如果你只希望你的數(shù)據(jù)在服務(wù)器運(yùn)行的時(shí)候存在,你也可以不使用任何持久化方式。
以上就是Redis緩存持久化技術(shù)解析的詳細(xì)內(nèi)容,更多關(guān)于redis持久化的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis拓展之定時(shí)消息通知實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Redis拓展之定時(shí)消息通知實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Redis系列之底層數(shù)據(jù)結(jié)構(gòu)SDS詳解
SDS(簡(jiǎn)單動(dòng)態(tài)字符串)是Redis使用的核心數(shù)據(jù)結(jié)構(gòu),用于替代C語(yǔ)言的字符串,以解決長(zhǎng)度獲取慢、內(nèi)存溢出等問(wèn)題,SDS通過(guò)預(yù)分配與惰性釋放策略優(yōu)化內(nèi)存使用,增強(qiáng)安全性,且能存儲(chǔ)文本與二進(jìn)制數(shù)據(jù),可查看源碼src/sds.h和src/sds.c了解更多2024-11-11
分布式使用Redis實(shí)現(xiàn)數(shù)據(jù)庫(kù)對(duì)象自增主鍵ID
本文介紹在分布式項(xiàng)目中使用Redis生成對(duì)象的自增主鍵ID,通過(guò)Redis的INCR等命令實(shí)現(xiàn)計(jì)數(shù)器功能,具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12
Redis?存儲(chǔ)對(duì)象信息用?Hash?和String的區(qū)別
這篇文章主要介紹了Redis存儲(chǔ)對(duì)象信息用Hash和String的區(qū)別,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
Redis腦裂導(dǎo)致數(shù)據(jù)丟失的解決
本文主要介紹了Redis腦裂導(dǎo)致數(shù)據(jù)丟失的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
Redis過(guò)期數(shù)據(jù)是否會(huì)被立馬刪除
這篇文章主要為大家介紹了Redis過(guò)期數(shù)據(jù)會(huì)被立馬刪除么的問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07

