redis++:Redis持久化 save和bgsave區別 及 自動觸發bgsave機制(二)


save:

  優點:節約系統資源

  缺點:直接調用 rdbSave ,阻塞 Redis 主進程,直到保存完成為止。在主進程阻塞期間,服務器不能處理客戶端的任何請求。

bgsave:

  優點:fork 出一個子進程,子進程負責調用 rdbSave ,並在保存完成之后向主進程發送信號,通知保存已完成。 Redis 服務器在BGSAVE 執行期間仍然可以繼續處理客戶端的請求

  缺點:由於會fork一個進程,因此更消耗內存

綜上:

  還是推薦使用bgsave命令,畢竟save命令阻塞其他請求是我們無法接受的

---------------------------------------------------

save m n:觸發機制

  自動觸發最常見的情況是在配置文件中通過save m n,指定當m秒內發生n次變化時,會觸發bgsave。

  例如,查看Redis根目錄默認配置文件 redis.conf,看到如下配置信息:

 

其中save 900 1的含義是:當時間到900秒時,如果Redis數據發生了至少1次變化,則執行bgsave;save 300 10和save 60 10000同理。

當三個save條件滿足任意一個時,都會引起bgsave的調用。

save m n:實現原理

1、Redis的save m n,是通過serverCron函數、dirty計數器、和lastsave時間戳來實現的。

2、serverCron是Redis服務器的周期性操作函數,默認每隔100ms執行一次(可在redis.conf  文件中配置 默認:hz  10 這個配置表示1s內執行10次,也就是每100ms觸發一次定時任務)

   該函數對服務器的狀態進行維護,其中一項工作就是檢查 save m n 配置的條件是否滿足,如果滿足就執行 bgsave

3、dirty計數器是Redis服務器維持的一個狀態,記錄了上一次執行bgsave/save命令后,服務器狀態進行了多少次修改(包括增刪改);而當save/bgsave執行完成后,會將dirty重新置為0。

4、例如,如果Redis執行了set mykey helloworld,則dirty值會+1;如果執行了sadd myset v1 v2 v3,則dirty值會+3;注意dirty記錄的是服務器進行了多少次修改,而不是客戶端執行了多少修改數據的命令。

5、lastsave時間戳也是Redis服務器維持的一個狀態,記錄的是上一次成功執行save/bgsave的時間。

6、save m n的原理如下:每隔100ms,執行serverCron函數;在serverCron函數中,遍歷save m n配置的保存條件,只要有一個條件滿足,就進行bgsave。

對於每一個save m n條件,只有下面兩條同時滿足時才算滿足:

當前時間-lastsave > m
dirty >= n

save m n : 執行日志

下圖是save m n觸發bgsave執行時,服務器打印日志的情況:

其他觸發機制:

  除了save m n以外,還有一些其他情況會觸發bgsave:

  在主從復制場景下,如果從節點執行全量復制操作,則主節點會執行 bgsave 命令,並將rdb文件發送給從節點;

  執行shutdown命令時,自動執行rdb持久化,如下圖所示:

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM