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 會慢一些。