Redis持久化機制

Redis把數據存儲在內存中,當進程退出後數據就會丟失。Redis持久化機制能夠將內存中的數據存儲到磁盤上,當從新啓動時能夠從磁盤文件中讀取數據加載到內存中。redis

Redis支持兩種持久化機制:全量鏡像RDB和增量式持久化AOF。數據庫

RDB

RDB是Redis的快照,存儲了Redis中全部未過時的鍵值對。緩存

redis.conf中配置RDB:app

# 配置rdb文件的路徑
# 若使用相對路徑,工做目錄由 dir 配置指定
dbfilename dump.rdb
dir /var/lib/redis

# save 項配置保存策略, 格式爲`save <seconds> <changes>`
# save 條件能夠配置多個, 若其中任一個條件被知足則會更新快照
save 900 1 # 900 秒內至少有 1 個 key 被改變 
save 300 10 # 300 秒內至少有 300 個 key 被改變 
save 60 10000 # 60 秒內至少有 10000 個 key 被改變
save "" # 註釋全部 save 配置,或在最後添加一個空的save配置能夠禁用自動保存

stop-writes-on-bgsave-error yes # 當保存快照文件失敗後,redis再也不執行任何寫請求,以免沒法持久化形成錯誤
rdbcompression yes # 在保存快照時對文件進行壓縮
rdbchecksum yes # 在快照文件結尾添加一個CRC64校驗和;若該配置項爲no則會寫入0做爲校驗和,表示redis從新啓動時無需進行校驗

每次redis進程啓動時會先檢查rdb文件是否存在,若存在則將文件中的內容加載到內存中。工具

redis自動更新RDB文件時會fork一個子進程執行快照保存工做,在保存期間主進程能夠正常的提供服務。性能

咱們一樣能夠經過指令保存快照:操作系統

  • save: 以阻塞的方式保存快照,保存期間redis不能處理其它請求
  • bgsave: fork一個子進程完成保存工做,保存期間不會影響redis的正常服務。

lastsave命令能夠獲得最新的RDB文件建立時間戳,能夠用來檢查保存是否成功。日誌

AOF

RDB做爲數據庫快照,每次建立都須要將整個數據庫寫入到文件。這是一個很是耗時的操做,所以也難以頻繁進行,在出現異常時可能丟失大量數據。code

Redis提供了增量式持久化工具AOF(Append Only ile), AOF經過記錄Redis數據庫中全部寫指令進行持久化。AOF文件中以Redis通訊協議的格式存儲指令。進程

當Redis進程啓動時會檢查AOF文件是否存在,若存在則依次執行AOF中的指令恢復數據。

Redis每次執行寫指令時都會向AOF文件中添加一條日誌,但新的記錄不會當即寫入磁盤(fsync)而是緩存在寫入緩衝區中。

咱們能夠配置將緩衝區中的數據寫入磁盤的策略,避免數據丟失。

將緩衝區中數據寫入磁盤是一個耗時操做,頻繁寫磁盤會對性能形成影響可是Redis崩潰丟失數據也較少,所以咱們須要根據應用場景進行權衡。

日誌重寫

AOF中可能會記錄多餘的指令,若咱們對同一個key執行了100次set指令, AOF文件中就會有100條記錄但只僅保留最後一條set指令便可恢復數據。AOF重寫會整理AOF文件清理沒必要要的指令日誌(如刪除被覆蓋的set指令),減小AOF文件大小。

redis 採用後臺重寫的策略,即 fork 一個子進程把整理後的 AOF 寫入到臨時文件中。使用BGREWRITEAOF能夠手動觸發後臺重寫操做。

實際上AOF重寫不會讀取原來的AOF文件,子進程會帶有一份當前數據的副本,並根據該副本直接生成新的AOF文件。

主進程在重寫期間將新增的寫操做寫入原來的 AOF文件 和 AOF重寫緩存 中,即便重寫失敗原來的AOF文件仍保存了完整的數據。當子進程完成AOF重寫後會向主進程發送信號,主進程收到該信號後會將AOF重寫緩存中的內容寫入新的AOF文件,而後用新的AOF文件覆蓋原有文件。

redis.conf中配置AOF:

# 是否開啓AOF,默認關閉(no)  
appendonly yes  
  
#  AOF 文件名  
appendfilename appendonly.aof  
  
# AOF 文件寫入策略
# appendfsync always # 每次收到寫命令就當即強制寫入磁盤, 一致性最好但性能最差
appendfsync everysec # 每秒鐘寫入磁盤一次, 平衡一致性和性能,推薦配置
# appendfsync no     # 依賴操做系統的寫入策略,通常爲30秒左右一次,性能最好可是一致性最沒有保證
    
# 在 AOF 重寫期間將 appendfsync 配置爲 no, 
# 默認配置爲 no 避免由於磁盤IO性能不足,致使重寫時間過長。若重寫期間 redis 崩潰則可能丟失數據。
# 配置爲 yes 則能夠保證一致性,但會延長重寫耗時
no-appendfsync-on-rewrite no   
  
# AOF文件新增大小達到上次重寫後文件大小的 100%,則自動進行AOF重寫。
# 配置爲 0 會禁用自動重寫  
auto-aof-rewrite-percentage 100  
  
# 當前AOF文件超過64mb纔會自動進行AOF重寫
auto-aof-rewrite-min-size 64mb

Redis會記錄啓動時或上次重寫後AOF文件的大小,若新增數據的大小達到原大小的100%(auto-aof-rewrite-percentage配置)則觸發重寫。

只有當前AOF文件體積大於auto-aof-rewrite-min-size時纔會執行重寫操做,不然即便新增數據量超過指定百分比也不會執行重寫。這樣避免了原文件太小致使初期頻繁重寫的問題。

相關文章
相關標籤/搜索