天天看點

Redis随筆(三)-RDB持久化一、redis持久化二、RDB快照三、自動生成

一、redis持久化

什麼是持久化,簡單來講就是将資料放到斷電後資料不會丢失的裝置中。也就是我們通常了解的硬碟上。

因為redis是記憶體資料庫,它将自己的資料庫狀态儲存到記憶體裡面,如果不想辦法将記憶體裡面的資料庫狀态儲存到磁盤裡面,那麼一旦伺服器程序退出,伺服器中資料庫狀态也會丢(ps:redis是一個鍵值對資料庫伺服器,伺服器中通常包含任意個非空資料庫,伺服器中非空資料庫以及他們的鍵值對就是資料庫狀态)。

為了解決這個問題

redis提出RDB 持久化和 AOF 持久化方式。

二、RDB快照

RDB快照:Redis支援将目前資料的快照存成一個資料檔案的持久化機制。

Redis借助了fork指令的copy on write機制。在生成快照時,将目前程序fork出一個子程序,然後在子程序中循環所有的資料,将資料寫成為RDB檔案。

生成方式:

指令生成:redis可以通過SAVE或BGSAVE指令生成rdb檔案

自動生成:可以在redis.conf中配置使它自動生成

注:Redis在生成RDB檔案時,不能進行AOF重寫。

Redis随筆(三)-RDB持久化一、redis持久化二、RDB快照三、自動生成

1、SAVE指令

SAVE指令執行時,redis伺服器會被阻塞,此時用戶端所有的指令都會被拒絕,隻有當伺服器執行完SAVE指令、重新開始接受指令請求後,用戶端發送的指令才會被處理。

用戶端執行SAVE指令如下圖所示:

Redis随筆(三)-RDB持久化一、redis持久化二、RDB快照三、自動生成

2、BGSAVE指令

BGSAVE指令儲存工作是由子程序執行的,是以在子程序建立rdb檔案的過程中,redis伺服器仍然可以處理用戶端請求。

用戶端執行BGSAVE指令如下圖所示:

Redis随筆(三)-RDB持久化一、redis持久化二、RDB快照三、自動生成

3、RDB檔案

dump.rdb 是二進制檔案,可以用od -c ./dump.rdb指令檢視其中内容。

Redis随筆(三)-RDB持久化一、redis持久化二、RDB快照三、自動生成
Redis随筆(三)-RDB持久化一、redis持久化二、RDB快照三、自動生成

一個rdb檔案沒有包含任何資料庫狀态時,由以下四部分組成:

  1. 5個位元組的’REDIS’字元串
  2. 四個位元組的版本号(db_version):0008
  3. 一個位元組的EOF常量:372
  4. 八個位元組的校驗和

三、自動生成

在redis.conf中有以下配置:

Redis随筆(三)-RDB持久化一、redis持久化二、RDB快照三、自動生成

可以通過save選項設定多個多個儲存條件,隻要其中一個滿足,伺服器就會執行bgsave指令。

表示在m秒内,至少進行n次修改。

在redis服務中的狀态如下:

Redis随筆(三)-RDB持久化一、redis持久化二、RDB快照三、自動生成
  1. dirty:dirty計數器記錄上次執行SAVE或者BGSAVE指令後,伺服器對資料庫狀态執行多少次寫操作,執行一次寫操作後,dirty計數器加1,但是如果執行同時添加多個值(例:sadd a b c),dirty添加3。
  2. lastsave:lastsave屬性是一個Unix時間戳,記錄上一次執行SAVE或者BGSAVE的時間
  3. redis伺服器會周期性操作函數serverCron,預設100毫秒執行一次,該函數對正在運作的伺服器進行維護,他的其中一項工作就是檢查save選項所設定儲存條件是否已經滿足,周遊數組,如果滿足就執行BGSAVE指令,dirty計數器歸0,更新lastsave時間戳。

繼續閱讀