redis 持久性

1,redis 優缺點

 優點:redis將數據都存儲在內存中,所以訪問速度快。

 缺點:重啓後內存中的數據將全部丟失。

2,持久性

  持久性:redis 將數據從內存中以某種形式同步到硬盤,使得重啓後可以根據硬盤中的記錄恢復數據。

3,持久性的兩種方式

  • RDB方式:根據指定的規則“定時”將內存中的數據存儲在硬盤上。
  • AOF方式:在每次執行命令後將命令本身記錄下來。

4,RDB方式

    rdb方式的持久性,當符合一定條件時,redis會自動將內存中的所有數據生成一份副本並存儲在硬盤上,這個過程稱爲快照。

  快照原理,過程如下:

  • redis 使用fork 函數複製一份當前進程(父進程)的副本(子進程);
  • 父進程繼續接收並處理客戶端發來的命令,而子進程開始將內存中的數據寫入硬盤中的臨時文件;
  • 當子進程寫入完所有數據後會用臨時文件替換舊的rdb 文件,至此一次快照操作完成。

   redis在快照過程中不會修改rdb 文件,只有快照結束後纔會將舊的文件替換成新的,也就是任何時候rdb 文件都是完整的。

   redis 啓動後會讀取rdb 快照文件,將數據從硬盤載入內存。

   通過rdb 持久化,一旦redis 異常退出,就會丟失最後一次快照以後更改的所有數據。

5,rdb 快照的幾種情況

  • 根據配置規則進行自動快照。
  • 用戶執行 save 或 bgsave。
  • 執行flushall 命令。
  • 執行復制(replication)。

5.1 根據配置規則進行自動快照

      進行快照的條件可以由用戶在配置文件中自定義,由兩個參數構成:時間窗口M 和改動的鍵的個數N。每當時間M 內被更改的鍵的個數大於N 時,即符合自動快照條件。

      save 900 1     (在15分鐘內有一個或一個以上的鍵被更改則進行快照,15分鐘=900秒)

     save 300 10    (在300秒內至少有10個鍵被更改)

    save 60  10000

   每條快照條件佔一行,並且以save 參數開頭。同時可以存在多個條件,條件之間是“或”的關係。

5.2 用戶執行save 或bgsave 命令

     這是手動執行快照。區別是save 命令,在快照 執行過程中,redis 會阻塞所有來自客戶端的請求;而bgsave 可以在後臺異步地進行快照操作,快照的同時服務器還可以繼續響應來自客戶端的請求。

5.3 執行flushall 命令

    flushall 命令,redis 會清除數據庫中所有數據。

  • 當自動快照條件不爲空時,不論清空數據庫的過程是否觸發了自動快照的條件,redis 就會執行一次快照操作;
  • 當沒有定義自動快照條件時,執行flushall 時不會進行快照。

5.4 執行復制

    當設置了主從模式時,redis 會在複製初始化時進行自動快照。即使沒有定義自動快照條件,並且沒有手動執行過快照操作,也會生成rdb 快照文件。

 

6,AOF 方式

   AOF 將執行的每一條命令追加到硬盤文件中,當使用redis 存儲非臨時數據時,一般需要打開aof 持久化來降低進程中止導致的數據丟失。

6.1 AOF 方式開啓

   默認情況redis 是關閉的,可以通過appendonly 參數啓用:

   appendonly  yes

  開啓aof 後,每執行一條更改redis 中數據的命令,redis 就會將該命令寫入硬盤中的AOF 文件。

6.2 AOF 實現

   AOF 文件以純文本的形式記錄了redis 執行的寫命令,該內容正是redis 客戶端向redis 發送的原始通信協議的內容。

   在啓動時redis 會逐個執行 aof文件中的命令將硬盤中的數據載入到內存中,載入的速度相較rdb 會慢一些。

 

 

 

 

 

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