Redis 持久化方式 - RDB 和 AOF 配置及 rewrite 機制

開篇

本文跟上一篇 Redis 數據持久化 - RDB 和 AOF 簡單介紹 緊密相關,主要介紹 redis 數據持久化如何配置,以及上一篇文章中存在的問題。redis

正文

redis 的核心配置配置是 redis.conf ,本文是基於 redis-4.0.6 版本講解。緩存

RDB 數據持久化配置

默認狀況下,redis 中的 RDB 數據持久化是開啓的。 在 redis.conf 有以下一段默認配置:app

save 900 1
save 300 10
save 60 10000

# 可自行定義(不推薦更改),格式以下:
# save <seconds> <changes>

配置說明:異步

好比 save 60 10000 表示若是 60s 內,有 10000 個 key 發生了改變,就保存一次快照,而且每次生成一個新的快照,都會覆蓋以前的老快照。操作系統

補充:.net

  1. 經過 redis-cli SHUTDOWN 命令去停掉redis,redis 在退出的時候會將內存中的數據當即生成一份完整的 rdb 快照
  2. 能夠手動調用 save 或者 bgsave 命令,同步或異步執行 rdb 快照生成
  3. 把上面三行配置註釋或者刪除掉,就能夠關閉 RBD 持久化

AOF 數據持久化配置

AOF持久化,默認是關閉的。 打開 redis.conf, 找到以下配置日誌

appendonly no # 改成 yes 就開啓了 AOF

appendfilename "appendonly.aof" # aof 文件名

# appendfsync always
appendfsync everysec # 默認
# appendfsync no

開啓 AOF 持久化以後,redis 每次接收到一條寫命令,會先寫入操做系統 cache 中,而後每隔必定時間再 fsync 一下,這就對應了上面的 appendfsync 配置code

fsync 三種策略blog

appendfsync always :每次寫入一條數據就執行一次fsync; 
appendfsync everysec:每隔一秒執行一次fsync; 
appendfsync no :不主動執行fsync, 有操做系統本身決定

再談 AOF 的 rewrite 機制

redis 中有緩存淘汰策略,所以會出現數據自動過時,另外也可能會被用戶主動刪除,致使 redis 中數據變少了。進程

可是,雖然數據被刪除了,其對應的寫日誌還在 AOF 日誌文件中,而且由於 AOF 日誌文件就一個,所以這個文件會不斷變大~~

因此纔有了 rewrite 來解決這個問題,AOF 會自動在後臺每隔必定時間作 rewrite 操做。

好比日誌裏存放了 100w 條數據的寫日誌,而 redis 內存中的數據只有 10 w。

AOF 會基於當前內存中的 10w 條數據構建一個新的日誌文件,而後覆蓋以前的舊的日誌文件。

補充:

  1. redis 2.4 以後,會自動進行 rewrite 操做

  2. 在redis.conf中,能夠配置 rewrite 策略

    auto-aof-rewrite-percentage 100 
     auto-aof-rewrite-min-size 64mb
    
     # 舉例說明上述配置的意義
     好比說上一次 rewrite 以後,日誌文件大小是 128 MB
     若是發現日誌文件增加的比例超過了100%(對應第一條配置),好比日誌文件變爲 300MB
     而後就去跟 64 MB(對應第二條配置)作比較,若是大於 64 MB,纔會去觸發rewrite
  3. 若是 redis 在寫入 AOF 文件時,機器宕機可能會致使 AOF 文件破損 ,這時能夠用 redis-check-aof --fix 命令來修復破損的 AOF 文件

rewrite 流程

  1. redis fork一個子進程
  2. 子進程基於當前內存中的數據,開始往一個新的 臨時的AOF文件 中寫入日誌
  3. redis 主進程接收到客戶端新的寫操做以後,會將新的日誌寫入內存,同時寫入到舊的AOF文件
  4. 子進程寫完新的日誌文件以後,redis 主進程將內存中的新日誌再次追加到新的 AOF 文件中
  5. 用新的日誌文件替換掉舊的日誌文件

其餘

  1. AOF 和 RDB 都開啓的時候,redis重啓的時候,優先經過 AOF 進行數據恢復,由於數據比較完整
  2. RDB 在生成快照時,redis 不會執行 AOF rewrite

總結

實踐是檢驗真理的惟一標準,只有動手實踐,才能真正體會 redis 是如何作數據恢復的,另外也能夠用記事本打開 rdb 快照文件和 aof 日誌文件,去看看裏面存的是什麼東西。

相關文章
相關標籤/搜索