源碼分析:redis的RDB持久化方式

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:好記性不如爛筆頭!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章