新聞中心
Redis 有兩種持久化方案,RDB (Redis DataBase)和 AOF (Append Only File),本篇文章重點(diǎn)為大家講解一下Redis RDB 持久化方式。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了蔚縣免費(fèi)建站歡迎大家使用!
RDB 持久化
RDB 持久化既可以手動(dòng)執(zhí)行,也可以根據(jù)服務(wù)器配置選項(xiàng)定期執(zhí)行,該功能可以將某個(gè)時(shí)間點(diǎn)上的數(shù)據(jù)庫狀態(tài)保存到一個(gè) RDB 文件中 RDB 持久化功能所生成的 RDB 文件是一個(gè)經(jīng)過壓縮的二進(jìn)制文件,通過該文件可以還原生成 RDB 文件時(shí)的數(shù)據(jù)庫狀態(tài)
RDB 文件的創(chuàng)建與載入
有兩個(gè) Redis 命令可以用于生成 RDB 文件,一個(gè)是 SAVE,另一個(gè)是 BGSAVE SAVE 命令會(huì)阻塞 Redis 服務(wù)器進(jìn)程,直到 RDB 文件創(chuàng)建完畢為止,在服務(wù)器進(jìn)程阻塞期間,服務(wù)器不能處理任何命令請求
BGSAVE 命令會(huì)派生出一個(gè)子進(jìn)程,然后由子進(jìn)程負(fù)責(zé)創(chuàng)建 RDB 文件,父進(jìn)程繼續(xù)處理命令請求
RDB 文件的載入工作是在服務(wù)啟動(dòng)時(shí)自動(dòng)執(zhí)行的,所以 Redis 并沒有專門用于載入 RDB 文件的命令,只要 Redis 服務(wù)器在啟動(dòng)時(shí)檢測到 RDB 文件存在,它就會(huì)自動(dòng)載入 RDB 文件
因?yàn)?AOF 文件的更新頻率通常比 RDB 文件的更新頻率高,所以如果服務(wù)器開啟了 AOF 持久化功能,那么服務(wù)器會(huì)優(yōu)先使用 AOF 文件來還原數(shù)據(jù)庫狀態(tài) 只有在 AOF 持久化功能處于關(guān)閉狀態(tài)時(shí),服務(wù)器才會(huì)使用 RDB 文件來還原數(shù)據(jù)庫狀態(tài)
SAVE 命令執(zhí)行時(shí)的服務(wù)器狀態(tài):
當(dāng) SAVE 命令執(zhí)行時(shí),Redis 服務(wù)器會(huì)被阻塞,所以當(dāng) SAVE 命令正在執(zhí)行時(shí),客戶端發(fā)送的所有命令請求都會(huì)被拒絕
只有在服務(wù)器執(zhí)行完 SAVE 命令、重新開始接受命令請求之后,客戶端發(fā)送的命令才會(huì)被處理
BGSAVE 命令執(zhí)行時(shí)的服務(wù)器狀態(tài):
子進(jìn)程創(chuàng)建 RDB 文件的過程中,Redis 服務(wù)器仍然可以繼續(xù)處理客戶端的命令請求,但是,在 BGSAVE 命令執(zhí)行期間,服務(wù)器處理 SAVE、BGSAVE、BGREWRITEAOF 三個(gè)命令的方式會(huì)和平時(shí)有所不同
首先,在 BGSAVE 命令執(zhí)行期間,客戶端發(fā)送的 SAVE 命令會(huì)被服務(wù)器拒絕,服務(wù)器禁止 SAVE 命令和 BGSAVE 命令同時(shí)執(zhí)行是為了避免父進(jìn)程和子進(jìn)程同時(shí)執(zhí)行兩個(gè) rdbSave 調(diào)用,防止產(chǎn)生競爭條件
其次,在 BGSAVE 命令執(zhí)行期間,客戶端發(fā)送的 BGSAVE 命令會(huì)被服務(wù)器拒絕,因?yàn)橥瑫r(shí)執(zhí)行兩個(gè) BGSAVE 命令也會(huì)產(chǎn)生競爭條件
最后,BGREWRITEAOF 和 BGSAVE 兩個(gè)命令不能同時(shí)執(zhí)行
如果 BGSAVE 命令正在執(zhí)行,那么客戶端發(fā)送的 BGREWRITEAOF 命令會(huì)被延遲到 BGSAVE 命令執(zhí)行完畢之后執(zhí)行
如果 BGREWRITEAOF 命令正在執(zhí)行,那么客戶端發(fā)送的 BGSAVE 命令會(huì)被服務(wù)器拒絕
因?yàn)?BGREWRITEAOF 和 BGSAVE 兩個(gè)命令的實(shí)際工作都由子進(jìn)程執(zhí)行,所以這兩個(gè)命令在操作方面并沒有什么沖突的地方,不能同時(shí)執(zhí)行它們只是一個(gè)性能方面的考慮一一并發(fā)出兩個(gè)子進(jìn)程,并且這兩個(gè)子進(jìn)程都同時(shí)執(zhí)行大量的磁盤寫入操作
RDB 文件載入時(shí)的服務(wù)器狀態(tài): 服務(wù)器在載入RDB 文件期間,會(huì)一直處于阻塞狀態(tài),直到載入工作完成為止
自動(dòng)間隔性保存
因?yàn)?BGSAVE 命令可以在不阻塞服務(wù)器進(jìn)程的情況下執(zhí)行,所以 Redis 允許用戶通過設(shè)置服務(wù)器配置的 save 選項(xiàng),讓服務(wù)器每隔一段時(shí)間自動(dòng)執(zhí)行一次 BGSAVE 命令
用戶可以通過 save 選項(xiàng)設(shè)置多個(gè)保存條件,但只要其中任意一個(gè)條件被滿足,服務(wù)器就會(huì)執(zhí)行 BGSAVE 命令 舉個(gè)例子,如果我們向服務(wù)器提供以下配置:
save 900 1
save 300 10
save 60 10000
那么只要滿足以下三個(gè)條件中的任意一個(gè),BGSAVE 命令就會(huì)被執(zhí)行:
服務(wù)器在 900 秒之內(nèi),對數(shù)據(jù)庫進(jìn)行了至少 1 次修改
服務(wù)器在 300 秒之內(nèi),對數(shù)據(jù)庫進(jìn)行了至少 10 次修改
服務(wù)器在 60 秒之內(nèi),對數(shù)據(jù)庫進(jìn)行了至少 10000 次修改
設(shè)置保存條件
通過設(shè)置 Redis 服務(wù)器配置的 save 選項(xiàng),可以讓服務(wù)器每隔一段時(shí)間自動(dòng)執(zhí)行一次 BGSAVE 命令;可以配置多個(gè)規(guī)則,只要滿足其中一個(gè)規(guī)則就執(zhí)行
服務(wù)器程序會(huì)根據(jù) save 選項(xiàng)設(shè)置服務(wù)器狀態(tài) redisServer 結(jié)構(gòu)的 saveparams 屬性
saveparams 屬性是一個(gè)數(shù)組,數(shù)組中每個(gè)元素都是一個(gè) saveparam 結(jié)構(gòu):
默認(rèn)的保存條件數(shù)據(jù)結(jié)構(gòu)如下:
dirty 計(jì)數(shù)器和 lastsave 屬性
服務(wù)器狀態(tài)還維護(hù)著一個(gè) dirty 計(jì)數(shù)器,以及一個(gè) lastsave 屬性:
dirty 計(jì)數(shù)器記錄距離上一次成功執(zhí)行 SAVE 命令或者 BGSAVE 命令之后,服務(wù)器對數(shù)據(jù)庫狀態(tài)進(jìn)行了多少次修改(包括寫入、刪除、更新等操作)
lastsave 屬性是一個(gè) UNIX 時(shí)間戳,記錄了服務(wù)器上一次成功執(zhí)行 SAVE 命令或者 BGSAVE 命令的時(shí)間
當(dāng)服務(wù)器成功執(zhí)行一個(gè)數(shù)據(jù)庫修改命令之后,程序就會(huì)對 dirty 計(jì)數(shù)器進(jìn)行更新:命令修改了多少次數(shù)據(jù)庫 dirty 計(jì)數(shù)器的值就增加多少
檢查保存條件是否滿足
Redis 的服務(wù)器周期性操作函數(shù) serverCron 默認(rèn)每隔 100 毫秒就會(huì)執(zhí)行一次,該函數(shù)用于對正在運(yùn)行的服務(wù)器進(jìn)行維護(hù),它的其中一項(xiàng)工作就是檢查 save 選項(xiàng)所設(shè)置的保存條件是否已經(jīng)滿足,如果滿足的話,就執(zhí)行 BGSAVE 命令
算法實(shí)現(xiàn): 遍歷并檢查 saveparams 數(shù)組中所有的保存條件,逐一與服務(wù)器狀態(tài)的 dirty 屬性和 lastsave 屬性進(jìn)行比較,只要有任意一個(gè)條件滿足就執(zhí)行 BGSAVE 命令
新聞標(biāo)題:RedisRDB持久化方式
文章鏈接:http://m.fisionsoft.com.cn/article/coeecih.html


咨詢
建站咨詢
