Redis持久化方式介紹

  Redis的持久化方法持久化方法有RDB文件和AOF文件兩種。下面主要介紹兩種持久化方法的原理缺點以及我在做交易系統異步化改造項目時用到redis的場景。

1 RDB文件

  RDB文件是一個經過壓縮的二進制文件,通過這個文件可以還原生成RDB文件時的數據庫狀態。RDB文件是直接保存在硬盤中的,所以即使Redis宕機也可以通過RDB文件恢復。生成RDB文件的Redis命令有SAVE和BGSAVE兩個。

1.1 SAVE命令

  Redis是單進程工作的,SAVE命令會阻塞Redis服務器進程,直到RDB文件創建完成之前,服務器不能接受任何處理命令。

1.2 BGSAVE命令

  不同於SAVE命令,BGSAVE通過子進程創建RDB文件。當接收到BGSAVE命令後,Redis主進程會fork一個子進程負責創建RDB文件,Redis此時還可以繼續處理客戶端命令。BGSAVE執行期間如果客戶端再次發送BGSAVE時會被拒絕,防止爭用rdbSave。同樣客戶端發送SAVE也會被拒絕。

1.3 RDB文件載入

  當RDB文件載入時,Redis會被阻塞,直到文件載入完成。

2 AOF文件

  AOF文件文件是Redis提供的另一種持久化方案,他記錄Redis服務器的執行命令還記錄數據庫的狀態(和MySQL的Binlog有點類似)。AOF命令中記錄的是純文本格式的命令。AOF持久化的過程分爲命令追加、文件寫入和文件同步三個過程。

2.1 命令追加

  當AOF持久化功能打開時,服務器在執行完一條命令後會以協議格式將執行完的命令追加到aof_buf緩衝區的末尾。

2.2 文件寫入與同步

  Redis服務進程是個事件循環,服務器每次在執行完一次事件之前都會調用flushAppendOnlyFile決定是否將aof緩衝區中的內容保存到AOF文件中。Redis服務器根據配置appendfsync決定同步策略,Redis爲appendfsync提供了三種配置,分別爲always、everysec、no。
  當配置爲always時,服務器每次事件循環都會將緩衝區中的所有內容都寫到文件中,速度最慢但是最安全。
  當配置爲everysec時,服務器每隔1秒回將緩存中數據寫到文件中,速度夠快,最多丟失1秒的數據。
  當配置爲no時,由操作系統決定什麼時間將緩存中內容寫入到AOF文件中。

2.3 數據還原

  Redis服務器利用AOF還原的原理是創建一個不帶網絡連接的僞客戶端執行AOF中保存的命令即可。

2.4 缺點

  AOF文件持久化得缺點是AOF文件往往會過大,雖然Redis提供了文件重寫機制,但是在操作較多的時候AOF文件仍會很大。

3 交易系統場景Redis使用

  我們交易系統Redis只當緩存用,並且不開啓持久化功能,redis中的數據通過消息隊列(kafka)同步到MySQL中,通過MySQL保證數據完整性、一致性。交易是個高頻寫入、峯值寫入會特別大的系統,由上面分析的Redis兩種持久化方案都會導致系統性能劇烈下降。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章