Redis中的兩種持久化方式,為什么需要兩種持久化?

redis中有兩種持久化(aof和rdb),下面本篇文章帶大家了解一下這兩種持久化,看看它們的優缺點,介紹一下為什么redis需要兩種持久化,希望對大家有所幫助!

Redis中的兩種持久化方式,為什么需要兩種持久化?

redis的兩種持久化方式

眾所周知,Redis中提供了AOF,RDB兩種持久化,下面先來簡單回顧一下。

RDB持久化

  • RDB持久化,就是把當前時間點的數據庫的狀態保存到磁盤中,又稱快照持久化
  • RDB可以手動觸發,也可以根據服務器配置定期執行。
  • RDB生成的文件,是一個經過壓縮的二進制文件,數據庫可以通過該文件還原到該時間點的狀態
  • Redis提供前臺RDB持久化命令SAVE和后臺RDB持久化命令BGSAVE,前臺執行時,Redis的其他命令會被阻塞,而后臺執行時,Redis還可以繼續處理客戶端的命令請求。
  • RDB二進制文件中,保存的是鍵值對數據,采用經過壓縮的自定義編碼,帶校驗。通過od命令可以轉化為可讀。
  • 主從復制時,初始化的全量復制采用RDB文件。

【相關推薦:redis

AOF持久化

  • AOF持久化,全稱是Appen Only File,意思是追加的持久化方式,其中保存的是寫命令,而非數據。
  • AOF持久化過程分為命令追加、文件寫入、文件同步三個步驟。
  • 命令追加:Redis服務端每執行完一個寫命令,都會以AOF協議格式將該寫命令追加到服務器狀態的aof_buf緩沖區末尾。
  • 文件寫入:Redis中,每結束一個事件循環之前,都會調用flushappendOnlyFile函數,將aof_buf緩沖區中的內容寫入到AOF文件。
  • 文件同步:同步sync指的是文件寫入到操作系統緩沖區中時,是否直接同步到磁盤中。通過配置,可以選擇立即同步、每秒同步、不主動同步而由操作系統控制,這三種同步方式。關于文件I/O緩沖:redis
  • Redis優先使用AOF文件來恢復數據。
  • AOF文件由于存儲命令,且沒有經過壓縮,其體積要大于RDB文件。
  • AOF文件可以定期采用BGREWRITEAOF重寫,減少重復命令、已失效命令,合并命令等。
  • AOF文件支持后臺重寫,采用fork子進程的形式實現。子進程帶有服務器進程的數據副本,再避免使用鎖的情況下保證數據安全性。另外也采用AOF重寫緩沖區解決了數據不一致。

兩種持久化分別的優缺點

RDB的優點

  • 文件體積小,適合拷貝做冷備

  • 相比AOF,備份恢復速度更快

RDB的缺點

  • 丟失數據多

  • fork子進程來做BGSAVE,消耗一定的內存資源

AOF的優點

  • 丟失數據少

  • 增加了寫緩沖區,無需尋址,速度快

  • append-only,也無需做磁盤尋址,效率高

AOF的缺點

  • 文件體積大

  • AOF每次都需要做一下寫入aof_buf的操作,開啟AOF持久化后,QPS會略微降低

Redis為什么需要兩種持久化?

經過上面的回顧,我們可以看到,RDB與AOF持久化有明顯區別。

  • 存儲的內容:RDB存儲某一時間點的數據;AOF存儲執行的寫命令。

  • 文件大小:RDB文件較小;AOF文件較大。

  • 寫入方式:RDB可采用前臺/后臺寫入方式;AOF采用每次執行寫命令,都將命令存入緩沖區的方式,另外可定期重寫。

  • 數據丟失:RDB丟失從宕機到上一次RDB同步之間的所有數據;AOF根據I/O緩沖區所配置的刷新方式,不丟失或丟失1s或幾秒的數據。

根據這些對比,可以看到RDB持久化更適合保存一個時間點的數據,在主從復制或者數據全量異地災備時,拷貝到其他地方,而AOF持久化由于丟失數據較少,比較適合作為本地備份,在Reids掛掉重啟時作為故障恢復。這就是我理解的為什么Redis需要兩種持久化方式

更多編程相關知識,請訪問:redis!!

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享