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ù)為空。)