redis持久化包括rdb和aof兩種方案
1、rdb持久化方案
- 持久化過程:按照redis.conf檔案配置,如
save 900 1
save 300 10
save 60 10000
,在指定時間間隔內滿足資料落盤策略時候,redis會fork一個和原程式一模一樣的子程式,該程式先將資料存到一個臨時檔案裡,待持久化結束後,用臨時檔案替換上次的持久化檔案。
- 觸發落盤:滿足配置的策略、使用flushdb、使用flushall(效果是所用資料都刪除了,落盤後dump.rdb(預設檔名,可配置)檔案內容為空)
- 恢復資料:將dump.rdb複製到安裝redis目錄,並啟動redis的服務。(連上redis後可以使用config get dir 獲取redis的安裝目錄)
劣勢:a、在一定間隔時間落盤一次,如果redis意外down,會弔事最後一次的redis中所有修改
b、fork的時候,記憶體中的資料被克隆了一份,大致2倍的膨脹性需要考慮
優勢:適合對資料完整性和一致性要求不高的場景;適合大規模的資料恢復
2、aof持久化方案
- 持久化過程:按照redis.conf檔案配置,如
#appendfsync always
appendfsync everysec
#appendfsync no
,根據同步策略為everysec,則每秒將寫操作追加(讀操作不會追加)到appendonly.aof檔案。
- 恢復資料:將appendonly.aof檔案複製到config get dir對應的目錄,並重啟redis
- 重寫機制:appendonly.aof的內容是以追加的方式新增的,如果沒有特殊機制,該檔案會越來越大,為避免這個情況,redis針對aof持久化方式有重寫機制
重寫過程:當aof檔案超過配置的閾值(滿足配置檔案的配置的策略),redis會fork出一個程式,該程式遍歷記憶體中的資料,每條記錄都對應一條set語句,寫入臨時的aof檔案,重寫完成後,用臨時檔案替換上次的持久化檔案。
劣勢:a、aof檔案遠大於rdb檔案
b、資料恢復速度慢於rdb
優勢:同步策略always->每次修改同步,效能差但完整性好;同步策略everysec->每秒同步,非同步操作,如果一秒內down機會丟失資料;no->從不同步
3、疑問
如果兩種持久化方式都配置了,那麼redis重啟時候,從哪裡恢復資料呢?
從appendonly.aof檔案恢復,因為aof持久化的資料更精確
是不是隻使用aof持久化方式呢?
…