前言:
redis持久化方式分為兩種:RDB快照和AOF方式(默認為RDB模式),當Redis服務器重啟的時候,會自動恢復數據,優先從AOF中恢復,其次才從RDB中恢復
一、RDB快照模式
RDB方式原理:當redis需要做持久化時(執行SAVA或者BGSAVA命令,或者是達到配置條件時執行),redis會fork一個子進程,子進程將數據寫到磁盤上一個臨時RDB文件中,當子進程完成寫臨時文件后,將原來的RDB替換掉(默認文件名為dump.rdb)
RDB備份條件和命令:
1、執行SAVE命令,在當前線程執行,會卡住
2、執行BGSAVE命令,在后台線程執行,馬上返回
3、當符合用戶給定的配置條件時Redis會自動將內存中的所有數據進行快照並存儲在硬盤上。由兩個參數構成:時間和改動的鍵的個數。當在指定的時間內被更改的鍵的個數大於指定的數值時就會進行快照,在配置文件redis.conf中
已經預置了3個條件:
save 900 1 # 900秒內有至少1個鍵被更改則進行快照 save 300 10 # 300秒內有至少10個鍵被更改則進行快照 save 60 10000 # 60秒內有至少10000個鍵被更改則進行快照
RDB優缺點:
定時備份,Redis效率高,但是容易造成數據丟失,丟失的多少和備份策略有關,例如:5分鍾備份一次,但是第8分時宕機了,那么就丟失了后面的3分鍾數據
一、AOF模式
AOF方式原理:AOF就可以做到全程持久化,Redis每執行一個修改數據的命令,都會把這個命令添加到AOF文件中,當Redis重啟時,將會讀取AOF文件進行“重放”以恢復到 Redis關閉前的最后時刻。
由於os會在內核中緩存 write做的修改,所以可能不是立即寫到磁盤上。這樣aof方式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴redis我們想要 通過fsync函數強制os寫入到磁盤的時機。有三種方式如下(默認是:每秒fsync一次)
appendonly yes //啟用aof持久化方式
# appendfsync always //每次收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用
appendfsync everysec //每秒鍾強制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦
# appendfsync no //完全依賴os,性能最好,持久化沒保證
AOF優缺點
AOF基本可以保證數據不丟失,但是AOF持久化文件會變的越來越大。例如我們調用incr test命令100次,文件中必須保存全部的100條命令,其實有99條都是多余的。