Redis持久化存儲(chǔ)

Redis支持兩種持久化方式:

(1)RDB:按照指定的規(guī)則“定期”將內(nèi)存中的數(shù)據(jù)存儲(chǔ)到硬盤上;

(2)AOF:定期或者在每次執(zhí)行命令后將命令本身記錄下來;

兩種持久化方式可以單獨(dú)使用一種,也可以二者同時(shí)使用。

一、RDB

RDB方式的持久化是通過對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行快照完成的,當(dāng)符合一定條件時(shí),Redis會(huì)自動(dòng)將內(nèi)存中的所有數(shù)據(jù)生成一份副本并存儲(chǔ)在硬盤上。

RDB觸發(fā)機(jī)制:

1、根據(jù)配置規(guī)則進(jìn)行自動(dòng)快照,配置文件中SNAPSHOTTING部分可設(shè)置;

2、用戶執(zhí)行SAVE或BGSAVE;

3、執(zhí)行FLUSHALL命令;

4、執(zhí)行復(fù)制(replication)時(shí)。

配置:

rdbcompression:是否在 dump .rdb 數(shù)據(jù)庫的時(shí)候使用 LZF 壓縮字符串,默認(rèn)都設(shè)為 yes,如果你希望保存子進(jìn)程節(jié)省點(diǎn)cpu,你就設(shè)置它為 no,不過這個(gè)數(shù)據(jù)集可能就會(huì)比較大

rdbchecksum:是否校驗(yàn)rdb文件,從rdb格式的第五個(gè)版本開始,在rdb文件的末尾會(huì)帶上CRC64的校驗(yàn)和,這跟有利于文件的容錯(cuò)性,但是在保存rdb文件的時(shí)候,會(huì)有大概10%的性能損耗,所以如果你追求高性能,可以關(guān)閉該配置。

dbfilename:設(shè)置dump文件的名字。

dir:rdb文件輸出路徑。

save:save 900 1 表示在900秒內(nèi)如果有一個(gè)key被操作了,就執(zhí)行保存快照,可以設(shè)置多個(gè)條件,各個(gè)條件彼此之間是或的關(guān)系,如果要禁用,將條件都刪除,寫成save ""即可。

原理:

1、SAVE:

Save是在Redis進(jìn)程中執(zhí)行的,由于Redis是單線程實(shí)現(xiàn),所以當(dāng)save命令在執(zhí)行時(shí)會(huì)阻塞Redis服務(wù)器一直到該命令執(zhí)行完成為止。

2、BGSAVE:

bgsave命令會(huì)先fork出一個(gè)子進(jìn)程,然后在子進(jìn)程中生成RDB文件。由于在子進(jìn)程中執(zhí)行IO操作,所以bgsave命令不會(huì)阻塞Redis服務(wù)器進(jìn)程,Redis服務(wù)器進(jìn)程在此期間可以繼續(xù)對(duì)外提供服務(wù)。

具體過程如下:

(1)Redis使用fork函數(shù)復(fù)制一份當(dāng)前進(jìn)程(父進(jìn)程)的副本(子進(jìn)程);

(2)父進(jìn)程繼續(xù)接受并處理客戶端發(fā)來的命令,而子進(jìn)程開始將內(nèi)存中的數(shù)據(jù)寫入硬盤中的臨時(shí)文件;

(3)當(dāng)子進(jìn)程寫入完所有數(shù)據(jù)后會(huì)用該臨時(shí)文件替換舊的RDB文件,至此,一次快照操作完成。

在執(zhí)行fork的時(shí)候,操作系統(tǒng)(類Unix)會(huì)使用寫時(shí)復(fù)制(copy-on-write)策略,即fork函數(shù)發(fā)生的一刻,父子進(jìn)程共享同一內(nèi)存數(shù)據(jù),當(dāng)父進(jìn)程要更改其中某片數(shù)據(jù)時(shí)(如執(zhí)行一個(gè)寫命令),操作系統(tǒng)會(huì)將該片數(shù)據(jù)復(fù)制一份以保證子進(jìn)程的數(shù)據(jù)不受影響,所以新的RDB文件存儲(chǔ)的是執(zhí)行fork一刻的內(nèi)存數(shù)據(jù)。

二、AOF

當(dāng)使用Redis存儲(chǔ)非臨時(shí)數(shù)據(jù)時(shí),一般需要打開AOF持久化來降低進(jìn)程終止導(dǎo)致的數(shù)據(jù)丟失。AOF可以將Redis執(zhí)行的每一條寫命令追加到硬盤文件中,這一過程顯然會(huì)降低Redis性能,但是大部分情況下這個(gè)影響是可以被接受的,另外可以使用較快的硬盤以提高AOF的性能。

配置:

appendonly:yes為啟用AOF,no為關(guān)閉AOF

appendfilename:AOF文件名

AOF文件保存路徑跟RDB文件相同,都是通過dir來設(shè)置

auto-aof-rewrite-percentage:aof自動(dòng)重寫配置。當(dāng)目前aof文件大小超過上一次重寫的aof文件大小的百分之多少進(jìn)行重寫,即當(dāng)aof文件增長(zhǎng)到一定大小的時(shí)候Redis能夠調(diào)用bgrewriteaof對(duì)日志文件進(jìn)行重寫,如果之前沒有重寫,則以啟動(dòng)時(shí)的aof文件大小為依據(jù)。當(dāng)前AOF文件大小是上次日志重寫得到AOF文件大小的二倍(設(shè)置為100)時(shí),自動(dòng)啟動(dòng)新的日志重寫過程。如果將百分比指定為0,則表示關(guān)閉該功能。

auto-aof-rewrite-min-size:設(shè)置允許重寫的最小aof文件大小,避免了達(dá)到約定百分比但尺寸仍然很小的情況還要重寫

appendfsync:aof持久化策略的配置,no表示不執(zhí)行fsync,由操作系統(tǒng)保證數(shù)據(jù)同步到磁盤(30秒每次,數(shù)據(jù)放在Page Cache中),速度最快,但是最不安全。always表示每次寫入都執(zhí)行fsync,以保證數(shù)據(jù)同步到磁盤。everysec表示每秒執(zhí)行一次fsync,可能會(huì)導(dǎo)致丟失這1s數(shù)據(jù)。dis-persistence-demystified.html,如果不確定,選擇"everysec"。

RDB載入的速度要比AOF載入的快,當(dāng)redis啟動(dòng)時(shí),如果rdb持久化和aof持久化都打開了,那么程序會(huì)優(yōu)先使用aof方式來恢復(fù)數(shù)據(jù)集,因?yàn)閍of方式所保存的數(shù)據(jù)通常是最完整的。如果aof文件丟失了,則啟動(dòng)之后數(shù)據(jù)庫內(nèi)容為空。

注意:如果想把正在運(yùn)行的redis數(shù)據(jù)庫,從RDB切換到AOF,建議先使用動(dòng)態(tài)切換方式,再修改配置文件,重啟數(shù)據(jù)庫。(不能直接修改配置文件,重啟數(shù)據(jù)庫,否則數(shù)據(jù)庫中數(shù)據(jù)就為空了,因?yàn)榧虞d的時(shí)候找不到aof文件,服務(wù)器就認(rèn)為數(shù)據(jù)為空。)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容