Redis持久化
RDB快照
在默認(rèn)情況下,Redis將內(nèi)存數(shù)據(jù)庫快照保存到dump.rdb的二進(jìn)制文件中。
可以對(duì)Redis進(jìn)行設(shè)置,讓它在“N秒內(nèi)數(shù)據(jù)集至少有N個(gè)改動(dòng)”, 這一條件被滿足時(shí),自動(dòng)保存一次數(shù)據(jù)集。比如說:讓Redis滿足“60秒內(nèi)至少有1000個(gè)鍵被改動(dòng)”這一個(gè)條件時(shí),自動(dòng)保存一次數(shù)據(jù)集。
save 60 1000
除了在配置文件中使用save關(guān)鍵字設(shè)置RDB快照,還可以在命令行中手動(dòng)執(zhí)行命令生成RDB快照,進(jìn)入redis客戶端執(zhí)行命令save或bgsave可以生成dump.rdb文件。
每次執(zhí)行命令都會(huì)將所有redis內(nèi)存快照保存到一個(gè)rdb文件里,并覆蓋原有的rdb快照文件。
save是同步命令,bgsave是異步命令,bgsave會(huì)從redis主進(jìn)程fork出一個(gè)子進(jìn)程專門用來生成rdb二進(jìn)制文件。
AOF(append only file)
快照功能并不是非常durable,如果redis因?yàn)槟承┰蚨斐晒收贤C(jī),那么服務(wù)器將丟失最近寫入且未保存到快照中的那些數(shù)據(jù)。從1.1版本,redis增加了一種完全durable的方式:AOF持久化,將修改的每一條指令記錄進(jìn)appendonly.aof中。修改配置文件來打開aof功能:
appendonly yes
打開aof功能,每當(dāng)redis執(zhí)行一個(gè)改變數(shù)據(jù)集的命令時(shí),這個(gè)命令就會(huì)追加到aof文件的末尾。這樣的話,當(dāng)redis重新啟動(dòng)時(shí),程序就會(huì)通過執(zhí)行aof文件中的命令來達(dá)到重建數(shù)據(jù)集的目的。
可以配置redis多久才將命令持久化到磁盤一次。
appendfsync always:每次有新命令追加到aof文件時(shí)就執(zhí)行一個(gè)持久化,非常慢但是安全
appendfsync everysec:每秒執(zhí)行一次持久化,足夠快(和使用rdb持久化差不多)并且在故障時(shí)只會(huì)丟失1秒鐘的數(shù)據(jù)
appendfsync no:從不持久化,將數(shù)據(jù)交給操作系統(tǒng)來處理。redis處理命令速度加快但是不安全。
默認(rèn)情況下 ,每秒執(zhí)行一次fsync, 這種fsync策略可以兼顧安全性和速度。
rdb和aof的區(qū)別:

redis啟動(dòng)時(shí)如果既有rdb文件又有aof文件則優(yōu)先選擇aof文件恢復(fù)數(shù)據(jù),因?yàn)閍of文件一般來說數(shù)據(jù)更安全一點(diǎn)。
二、AOF重寫
aof文件里可能有太多“瑣碎”指令,所以aof會(huì)定期根據(jù)內(nèi)存的最新數(shù)據(jù)重新生成aof文件
有兩個(gè)配置可以控制aof自動(dòng)重寫的頻率:
auto-aof-rewrite-min-size 64mb: aof文件至少要達(dá)到64m才會(huì)觸發(fā)制動(dòng)重寫,文件太小恢復(fù)速度本來就很快,重寫的意義不大
auto-aof-rewrite-percentage 100:aof文件上一次重寫后文件大小增長了100%則再次觸發(fā)重寫
當(dāng)然aof還可以手動(dòng)重寫,進(jìn)入redis客戶端執(zhí)行命令bgrewriteaof重寫aof。
觸發(fā)aof重寫時(shí),redis會(huì)fork一個(gè)子進(jìn)程去做,不會(huì)對(duì)redis正常命令處理有太多影響。
Redis 4.0混合持久化
重啟redis恢復(fù)數(shù)據(jù)集時(shí),很少會(huì)使用rdb來恢復(fù)內(nèi)存狀態(tài),因?yàn)闀?huì)丟失大量數(shù)據(jù)。通常會(huì)使用aof日志恢復(fù)數(shù)據(jù),但是重放aof日志性能相對(duì)rdb來說要慢很多,這樣在redis實(shí)例很大的情況下,啟動(dòng)需要花費(fèi)很長時(shí)間。Redis4.0為了解決這個(gè)問題,帶來了新的持久化選項(xiàng)——混合持久化。
aof-use-rdb-preamble yes
混合持久化aof文件結(jié)構(gòu):

如果開啟了混合持久化,aof在重寫時(shí),不再是單純將內(nèi)存數(shù)據(jù)轉(zhuǎn)換為RESP命令寫入aof文件,而是將重寫這一刻之前的內(nèi)存做rdb快照處理,并且將rdb快照內(nèi)容和增量的aof修改內(nèi)存數(shù)據(jù)的命令存在一起,都寫入新的aof文件,新的aof文件一開始不叫appendonly.aof,等到重寫完成后,新的aof文件才會(huì)進(jìn)行改名,原子的覆蓋原有的aof文件,完成新舊兩個(gè)aof文件的替換。
于是在redis重啟的時(shí)候,可以先加載rdb文件,然后再重放增量的aof日志就可以完全替代之前的aof全量文件重放,因此重啟效率大幅得到提高。
還沒關(guān)注我的公眾號(hào)?
- 掃文末二維碼關(guān)注公眾號(hào)【小強(qiáng)的進(jìn)階之路】可領(lǐng)取如下:
- 學(xué)習(xí)資料: 1T視頻教程:涵蓋Javaweb前后端教學(xué)視頻、機(jī)器學(xué)習(xí)/人工智能教學(xué)視頻、Linux系統(tǒng)教程視頻、雅思考試視頻教程;
- 100多本書:包含C/C++、Java、Python三門編程語言的經(jīng)典必看圖書、LeetCode題解大全;
- 軟件工具:幾乎包括你在編程道路上的可能會(huì)用到的大部分軟件;
- 項(xiàng)目源碼:20個(gè)JavaWeb項(xiàng)目源碼。
|