Redis對快照模式的深刻分析

  咱們知道redis是帶有持久化這個能力了,那到底持久化成到哪裏,持久化成啥樣呢???這篇咱們一塊兒來尋求答案。redis

  一:快照模式數組

  或許在用Redis之初的時候,就據說過redis有兩種持久化模式,第一種是SNAPSHOTTING模式,仍是一種是AOF模式,並且在實戰場景下用的最多的函數

  莫過於SNAPSHOTTING模式,這個不須要反駁吧,並且你可能還知道,使用SNAPSHOTTING模式,須要在redis.conf中設置配置參數,好比下面這樣:字體

  


  上面三組命令也是很是好理解的,就是說900指的是「秒數」,1指的是「change次數」,接下來若是在「900s「內有1次更改,那麼就執行save保存,一樣線程

  的道理,若是300s內有10次change,60s內有1w次change,那麼也會執行save操做,就這麼簡單,看了我剛纔說了這麼幾句話,是否是有種直覺在3d

  告訴你,有兩個問題是否是要澄清一下:cdn

  1. 上面這個操做應該是redis自身進行的同步操做,請問是否能夠手工執行save呢?server

  固然能夠進行手工操做,redis提供了兩個操做命令:save,bgsave,這兩個命令都會強制將數據刷新到硬盤中,以下圖:對象

  


  2. 看上面的圖,貌似bgsave是開啓單獨線程的,請問是嗎?blog

  確實如你所說,bgsave是開啓次線程進行數據刷新的,不信的話咱們來看看代碼,它的代碼是在rdb.c源文件中,以下:

  


  從上面的代碼中,有沒有看到一個重點,那就是fork方法,它就是一些牛人口中說的什麼fork出一個線程,今天你也算終於看到了,其實redis並非單純

  的單線程服務,至少fork告訴咱們,它在一些場景下也是會開啓工做線程的,而後能夠看到代碼會在工做線程中執行同步的bgsave操做,就這麼簡單。

  3. 能簡單說下saveparams參數在redis源碼中的邏輯嗎?

  能夠的,其實在redis中有一個週期性函數,叫作serverCron,它會週期性啓動,大概會作七件事情,如redis註釋所說:

  


  上面的紅色字體就是作了咱們所關心的save操做,看過方法的註釋,接下來咱們來找一下具體邏輯。

  


  從上面這段代碼邏輯,你應該能夠發現如下幾點:

  1. saveparams參數是在server對象下面,而server對象正好是redisServer類型,以下圖:

  


  從上面圖中 *saveparams 的註釋上來看,你應該知道*saveparams是saveparam類型的數組,那如今是否是有強烈的好奇心想看一下saveparam

  類型是怎麼定義的的呢??? 以下圖:

  


  能夠看到,saveparam參數裏面有兩個參數,seconds就是保存秒數,changes就是改變量,而這二個參數就對應着咱們配置文件中的900 0 這樣的

  配置節,想起來的沒有哈~~~

  2 而後咱們經過if發現,若是終知足,就會最終調用rdbSaveBackground來持久化咱們的rdb文件,簡單吧。。。

  

相關文章
相關標籤/搜索