redis中有兩種持久化(aof和rdb),下面本篇文章帶大家了解一下這兩種持久化,看看它們的優缺點,介紹一下為什么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