rdb快照保存有兩種方式,save和bgsave。
相同點:
都會調用rdbSave函數來進行快照保存。
不同點:
(1) SAVE 直接調用rdbSave ,阻塞Redis 主進程,直到保存完成爲止。在主進程阻塞期間,服務器不能處理客戶端的任何請求。
(2)BGSAVE 則fork 出一個子進程,子進程負責調用rdbSave ,並在保存完成之後向主進程發送信號,通知保存已完成。因爲rdbSave 在子進程被調用,所以Redis 服務器在
BGSAVE 執行期間仍然可以繼續處理客戶端的請求。
下面是bgsave的被應用場景:
1. redis的配置文件可配置開啓rdb方式,在m秒時間內發生n次變更則要進行rdb文件保存。
redis服務器啓動後主要是通過時間事件來運行serverCron函數進行條件檢查,若滿足條件則進行rdb文件保存。
/* If there is not a background saving/rewrite in progress check if
* we have to save/rewrite now */
// 如果有需要,開始 RDB 文件的保存
for (j = 0; j < server.saveparamslen; j++) {
struct saveparam *sp = server.saveparams+j;
if (server.dirty >= sp->changes &&
server.unixtime-server.lastsave > sp->seconds) {
redisLog(REDIS_NOTICE,"%d changes in %d seconds. Saving...",
sp->changes, sp->seconds);
rdbSaveBackground(server.rdb_filename);
break;
}
}
注:紅色部分表明以下幾點
(1)通過啓動子進程來進行rdb文件的生成和保存。文件保存期間,主進程不阻塞仍然可以正常提供服務。
(2)生成的rdb文件是啓動子進程那一時刻redis內存數據的快照,所以其文件內容會比aof方式的數據舊。因此在rdb和aof方式都開啓的情況下會優先載入aof文件。
(3)rdb是對內存快照的一次完整保存。所以rdb快照保存操作不宜頻繁進行。
2. redis的主從複製模式也是採用的bgsave方式,將rdb快照發給從服務器來進行備份。
ps:好記性不如爛筆頭!