Redis持久化

1、 文檔介紹redis

     redis做爲一個內存數據庫,讀寫快,效率高,可是也會有宕機丟失數據的風險,因而就須要持久化操數據庫

     Q&A:      緩存

     數據量大於內存大小時應該怎麼作?安全

     增長內存or採用內存淘汰策略orRedis集羣
服務器

     持久化會輔助擴大Redis的存儲空間麼?
工具

     不會,持久化的主要做用是數據備份,保證數據不會因進程退出而丟失優化

     (在dump的基礎上開始準備Restore的實現,dump操做的第一步就是將aof文件內的記錄同步到redis內,故瞭解一下aof文件)spa

2、RDB與AOF持久化的原理操作系統

2.1 RDB日誌

RDB能夠認爲是Snapshot文件,當恢復時,經過加載RDB文件。把數據從磁盤加載讀取到Redis中。

RDB產生:(考慮快照時的操做)

  • SAVE方式:阻塞請求
  • BGSAVE:fork一個子進程,子進程將快照寫到一個臨時的RDB文件,寫完以後替換舊的RDB文件

RDB的加載:

Redis持久化能夠禁用,此時數據僅存在於服務器的運行時間內

Redis持久化也能夠共存,當同時存在的時候,Redis重啓是會先加載AOF文件

2.2 AOF

AOF能夠認爲是日誌文件,Append only File,每次對數據的變動或者操做都會先記錄打AOF內,當服務啓動的時候就會先讀取這些文件,從新執行一遍來恢復原始數據。

AOF提供三種同步(寫aof文件與操做數據的同步)的方式:

  • always:每次操做記錄都同步到磁盤上,最低效,最安全
  • everysec:每秒執行一次將操做記錄同步到磁盤。默認
  • no:不自動執行同步,讓操做系統將緩存數據寫到硬盤上,不可靠,最快

AOF文件的格式與解析:

  • *,表示命令的參數個數,例如上面的set a 1 是三個 所以爲*3
  • ¥,表示參數的字節數,例如a這個參數是一個字節,所以爲$1
  • 無符號,表示是參數數據

AOF優化:(重寫)

當對一個如今爲0的值執行100遍「a++」操做的話,若是每一次都記錄一個操做再同步,很是浪費資源與時間,而且文件也會變大,重寫即將這一百條數據寫成set a 100,減小文件大小,而且提升載入速率

3、RDB與AOF的優缺點

3.1 RDB

優勢:

  • RDB是某一個時間點的備份,是一個緊湊的單文件,多用於數據備份。能夠按每小時或每日來備份,方便從不一樣的版本恢復
  • 單文件方便遠程傳輸便於故障恢復
  • RDB能夠Fork子進程進行持久化,使得Redis能夠更好的處理用戶的請求
  • 在數據量大的狀況下,RDB相比較於AOF加載的更快

缺點:

  • 若是RDB保存不及時會致使數據丟失
  • RDB常常須要Fork子進程去執行,fork操做十分耗費CPU,而且是全量的,AOF的Fork是增量的,而且AOF是可控的

3.2 AOF

優勢:

  • AOF能夠設置 徹底不一樣步、每秒同步、每次操做同,默認是每秒同步。由於AOF是操做指令的追加,因此能夠頻繁的大量的同步。
  • AOF文件是一個值追加日誌的文件,即便服務宕機爲寫入完整的命令,也能夠經過redis-check-aof工具修復這些問題。
  • 若是AOF文件過大,Redis會在後臺自動地重寫AOF文件。重寫後會使AOF文件壓縮到最小所需的指令集。
  • AOF文件是有序保存數據庫的全部寫入操做,易讀,易分析。即便若是不當心誤操做數據庫,也很容易找出錯誤指令,恢復到某個數據節點。例如不當心FLUSHALL,能夠很是容易恢復到執行命令以前。

缺點:

  • 相同數據量下,AOF的文件一般體積會比RDB大。由於AOF是存指令的,而RDB是全部指令的結果快照。但AOF在日誌重寫後會壓縮一些空間。
  • 在大量寫入和載入的時候,AOF的效率會比RDB低。由於大量寫入,AOF會執行更多的保存命令,載入的時候也須要大量的重執行命令來獲得最後的結果。RDB對此更有優點。

3、取捨

 

    通常來講,不考慮硬盤大小,最安全的作法是RDB與AOF同時使用,即便AOF損壞沒法修復,還能夠用RDB來恢復數據。

 

    若是Redis的數據在你的服務中並非必要的數據,例如只是當簡單的緩存,沒有緩存也不會形成緩存雪崩。說明數據的安全可靠性並非首要考慮範圍內,那麼單獨只使用RDB就能夠了。

 

    不推薦單獨使用AOF,由於AOF對於數據的恢復載入來講,比RDB慢。

相關文章
相關標籤/搜索