天天看點

15天玩轉redis —— 第十篇 對快照模式的深入分析

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

一:快照模式

  或許在用redis之初的時候,就聽說過redis有兩種持久化模式,第一種是snapshotting模式,還是一種是aof模式,而且在實戰場景下用的最多的

莫過于snapshotting模式,這個不需要反駁吧,而且你可能還知道,使用snapshotting模式,需要在redis.conf中設定配置參數,比如下面這樣:

上面三組指令也是非常好了解的,就是說900指的是“秒數”,1指的是“change次數”,接下來如果在“900s“内有1次更改,那麼就執行save儲存,同樣

的道理,如果300s内有10次change,60s内有1w次change,那麼也會執行save操作,就這麼簡單,看了我剛才說了這麼幾句話,是不是有種直覺在

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

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

   當然可以進行手工操作,redis提供了兩個操作指令:save,bgsave,這兩個指令都會強制将資料重新整理到硬碟中,如下圖:

15天玩轉redis —— 第十篇 對快照模式的深入分析

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

确實如你所說,bgsave是開啟次線程進行資料重新整理的,不信的話我們來看看代碼,它的代碼是在rdb.c源檔案中,如下:

15天玩轉redis —— 第十篇 對快照模式的深入分析

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

的單線程服務,至少fork告訴我們,它在一些場景下也是會開啟工作線程的,然後可以看到代碼會在工作線程中執行同步的bgsave操作,就這麼簡單。

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

可以的,其實在redis中有一個周期性函數,叫做servercron,它會周期性啟動,大概會做七件事情,如redis注釋所說:

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

15天玩轉redis —— 第十篇 對快照模式的深入分析

從上面這段代碼邏輯,你應該可以發現以下幾點:

<1>. saveparams參數是在server對象下面,而server對象正好是redisserver類型,如下圖:

15天玩轉redis —— 第十篇 對快照模式的深入分析

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

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

15天玩轉redis —— 第十篇 對快照模式的深入分析

可以看到,saveparam參數裡面有兩個參數,seconds就是儲存秒數,changes就是改變量,而這二個參數就對應着我們配置檔案中的900 0 這樣的

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

<2> 然後我們通過if發現,如果終滿足,就會最終調用rdbsavebackground來持久化我們的rdb檔案,簡單吧。。。

好了,大概就這樣了,希望對你有幫助。

繼續閱讀