1. 程式人生 > >Redis系列七:redis持久化

Redis系列七:redis持久化

always redis hset 順序 保存 退出 老版本 參數 div

redis支持RDB和AOF兩種持久化機制,持久化可以避免因進程退出而造成數據丟失

一、RDB持久化

RDB持久化把當前進程數據生成快照(.rdb)文件保存到硬盤的過程,有手動觸發和自動觸發
手動觸發有save和bgsave兩命令
save命令:阻塞當前Redis,直到RDB持久化過程完成為止,若內存實例比較大會造成長時間阻塞,線上環境不建議用它
bgsave命令:redis進程執行fork操作創建子線程,由子線程完成持久化,阻塞時間很短(微秒級),是save的優化,在執行redis-cli shutdown關閉redis服務時,如果沒有開啟AOF持久化,自動執行bgsave;
顯然bgsave是對save的優化。

bgsave運行流程

技術分享圖片

RDB文件的操作

命令:config set dir /usr/local //設置rdb文件保存路徑

備份:bgsave //將dump.rdb保存到usr/local下

恢復:將dump.rdb放到redis安裝目錄與redis.conf同級目錄,重啟redis即可

優點:1,壓縮後的二進制文文件適用於備份、全量復制,用於災難恢復

2,加載RDB恢復數據遠快於AOF方式

缺點:1,無法做到實時持久化,每次都要創建子進程,頻繁操作成本過高

2,保存後的二進制文件,存在老版本不兼容新版本rdb文件的問題

二、AOF持久化

針對RDB不適合實時持久化,redis提供了AOF持久化方式來解決

開啟:redis.conf設置:appendonly yes (默認不開啟,為no)

默認文件名:appendfilename "appendonly.aof"

流程說明:

   1,所有的寫入命令(set hset)append追加到aof_buf緩沖區中

2AOF緩沖區向硬盤做sync同步

3,隨著AOF文件越來越大,需定期對AOF文件rewrite重寫,達到壓縮

4,當redis服務重啟,可load加載AOF文件進行恢復

AOF持久化流程:命令寫入

(append),文件同步(sync),文件重寫(rewrite),重啟加載(load)

技術分享圖片

AOF配置詳解:

appendonly yes //啟用aof持久化方式

# appendfsync always //每收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用

appendfsync everysec //每秒強制寫入磁盤一次,性能和持久化方面做了折中,推薦

# appendfsync no //完全依賴os,性能最好,持久化沒保證(操作系統自身的同步)

no-appendfsync-on-rewrite yes //正在導出rdb快照的過程中,要不要停止同步aof

auto-aof-rewrite-percentage 100 //aof文件大小比起上次重寫時的大小,增長率100%,重寫

auto-aof-rewrite-min-size 64mb //aof文件,至少超過64M,重寫

如何從AOF恢復?

1. 設置appendonly yes

2. appendonly.aof放到dir參數指定的目錄;

3. 啟動RedisRedis會自動加載appendonly.aof文件。

redis重啟時恢復加載AOF與RDB順序及流程:

1,當AOFRDB文件同時存在時,優先加載AOF

2,若關閉了AOF,加載RDB文件

3,加載AOF/RDB成功,redis重啟成功

4AOF/RDB存在錯誤,redis啟動失敗並打印錯誤信息

Redis系列七:redis持久化