1、rdb持久化功能將內(nèi)存數(shù)據(jù)保存到磁盤上,避免數(shù)據(jù)意外丟失,rdb文件是一個(gè)經(jīng)過(guò)壓縮的二進(jìn)制文件,可以還原內(nèi)存數(shù)據(jù)狀態(tài)
2、redis文件的創(chuàng)建與載入
2.1、save bgsave
2.2、save命令會(huì)阻塞redis服務(wù)器進(jìn)程,直到rdb文件創(chuàng)建完畢為止,不會(huì)接受任務(wù)命令請(qǐng)求
2.3、bgsave會(huì)派生一個(gè)子進(jìn)程,然后子進(jìn)程負(fù)責(zé)創(chuàng)建rdb文件,可以繼續(xù)處理命令請(qǐng)求
創(chuàng)建rdb文件實(shí)際由rdbsave函數(shù)完成
2.4、rdb載入工作是在服務(wù)器啟動(dòng)時(shí)自動(dòng)執(zhí)行,并沒(méi)有專門的命令載入,載入期間,一直阻塞其他命令
3.5、aof文件的更新頻率比rdb文件更新頻率高,所以如果服務(wù)器開啟了aof持久化功能,優(yōu)先使用aof文件來(lái)還原數(shù)據(jù)庫(kù)轉(zhuǎn)態(tài),aof功能關(guān)閉狀態(tài)時(shí),服務(wù)器才會(huì)使用rdb文件還原數(shù)據(jù)庫(kù)狀態(tài)
bgsave命令執(zhí)行時(shí)候,拒絕下一個(gè)bgsave
bgrewiteaof 和bgsave不能同時(shí)執(zhí)行,會(huì)拒絕下一個(gè)
4、自動(dòng)間隔保存
save 900 1 ,900秒內(nèi),對(duì)數(shù)據(jù)庫(kù)進(jìn)行了至少一次修改,保存在saveparams 數(shù)組中
4.1、dirty計(jì)數(shù)器 lastsave屬性
dirty計(jì)數(shù)器保存了上一次save或者bgsave后,對(duì)數(shù)據(jù)庫(kù)狀態(tài)進(jìn)行了多少次修改,包括寫入,刪除,更新
lastsave保存上一次save或者bgsave的unix時(shí)間戳
4.2、檢查保存的條件 saveparams是否滿足,servercron每100毫秒執(zhí)行一次
5、rdb文件結(jié)構(gòu) REDIS db_version databases EOF check_sum
開頭是5字節(jié),REDIS字符,快速檢查載入的是否是RDB文件
db_version 長(zhǎng)度4字節(jié),值是一個(gè)字符串表示的整數(shù)記錄了rdb版本號(hào)
databases包含零個(gè)或任意多個(gè)數(shù)據(jù)庫(kù),以及各個(gè)數(shù)據(jù)庫(kù)中的鍵值對(duì)數(shù)據(jù),如果服務(wù)器的數(shù)據(jù)庫(kù),所有的庫(kù),為空,那么這部分也是空
EOF 長(zhǎng)度為1字節(jié),標(biāo)志著rdb文件正文內(nèi)容的結(jié)束
check_sum 8字節(jié),保存著一個(gè)校驗(yàn)和,通過(guò)前面四個(gè)部分內(nèi)容計(jì)算得出,檢查文件是否有損壞
6、databases部分,如果0號(hào)和3號(hào)為非空,那么database0 保存著0號(hào)數(shù)據(jù)庫(kù)中所有的鍵值對(duì),database3保存著3號(hào)數(shù)據(jù)庫(kù)中所有的鍵值對(duì)
每個(gè)非空數(shù)據(jù)庫(kù)的rdb文件都可以保存為selectdb db_number key_value_pairs三個(gè)部分
selectdb常量長(zhǎng)度為1字節(jié),當(dāng)程序遇到這個(gè)值時(shí)候,它知道接下來(lái)要讀的將是數(shù)據(jù)庫(kù)號(hào)碼
db_number保存著一個(gè)數(shù)據(jù)庫(kù)號(hào)碼,根據(jù)號(hào)碼的大小不同,長(zhǎng)度可以是1 2 5 字節(jié),讀入db_nuber后,服務(wù)器會(huì)立即調(diào)用select命令,切換數(shù)據(jù)庫(kù),key_value_pairs保存著所有的鍵值對(duì),根據(jù)鍵值對(duì)的數(shù)量 類型 內(nèi)容 以及是否有過(guò)期時(shí)間的不同,key_value_pairs長(zhǎng)度也會(huì)有所不同
7、key_value_pairs type 1字節(jié) key value三部分組成
帶有過(guò)期時(shí)間的 expiretime_ms常量 1字節(jié),告知讀入程序接下來(lái)將是一個(gè)以毫秒為單位的過(guò)期時(shí)間 ms 8字節(jié)長(zhǎng)的帶符號(hào)整數(shù),記錄一個(gè)以毫秒為單位的unix時(shí)間戳