做爲程序員你不知道Redis持久化,如何經過面試?

咱們都知道Redis是個內存數據庫,全部的數據都存儲在內存中。一旦服務器上Redis進程退出,數據庫中的數據就會丟失。redis

持久化是作什麼事呢?持久化簡單的理解就是將內存中的數據作個備份。Redis的持久化有兩種方法,即RDB持久化和AOF持久化。本文將會分兩部分介紹這兩種持久化方法,以及實現原理。數據庫

 

1、RDB持久化

Redis數據持久化是將內存中的數據保存到磁盤裏,避免數據意外丟失。RDB持久化會生成一個RDB文件,這個RDB文件是一個通過壓縮的二進制文件。經過該文件能夠還原出Redis數據庫中的數據。RDB的持久化能夠手動執行,也能夠根據服務器配置項按期自動執行。服務器

下面咱們一塊兒學習一下RDB文件是怎麼建立的。有兩個命令能夠建立RDB文件,一個是SAVE,另外一個是BGSAVE。app

執行SAVE命令會阻塞Redis服務器進程,直到RDB文件建立完成爲止,在服務器進程被阻塞期間,服務器不能處理任何命令請求。函數

執行BGSAVE命令會派生出一個子進程,而後由子進程負責建立RDB文件,服務器父進程繼續處理命令請求。性能

SAVE命令和BGSAVE命令的底層調用的函數都是同一個函數rdbSave,只不過SAVE命令是直接調用這個函數,而BGSAVE會fork()出子進程來調用這個函數。僞代碼以下:學習

RDB文件的載入工做是在服務器啓動時自動執行的,只要Redis服務器在啓動時檢測到RDB文件存在,就會自動載入RDB文件。值得一提的是,Redis服務器在載入RDB文件的期間,會一直處於阻塞狀態,直到載入工做完成爲止。spa

BGSAVE命令在不阻塞服務器進程的狀況下執行,因此Redis容許用戶經過設置服務器的save選項來讓服務器每隔一段時間自動執行一次BGSAVE命令。操作系統

上面條件只要知足其中一個,BGSAVE命令就會被執行:線程

  • 第一條的意思是:服務器在900秒內對數據庫執行過至少1次修改,就會執行BGSAVE命令
  • 第二條的意思是:服務器在300秒內對數據庫執行過至少10次修改,就會執行BGSAVE命令
  • 第三條的意思是:服務器在60秒內對數據庫執行過至少10000次修改,就會執行BGSAVE命令

2、AOF持久化

除了RDB持久化以外,Redis還提供了AOF持久化功能,二者的實現方式有着很大的不一樣。RDB持久化是經過保存數據庫中的鍵值對來記錄數據庫狀態,而AOF持久化是經過保存Redis服務器所執行的寫命令來記錄記錄數據庫狀態。

AOF持久化是如何實現的呢?AOF持久化分文三個步驟:命令追加、文件寫入、文件同步。

  • 命令追加:當AOF持久化功能打開時,服務器在執行完一個寫命令後,會以必定的格式將被執行的寫命令追加到服務器中的aof緩衝區中。aof緩衝區是redisServer結構體維護的一個SDS結構的屬性。
  • 文件寫入:文件寫入是指從Redis的aof緩衝區寫入到操做系統的內存緩衝區。這個過程是爲了提升文件的寫入效率,可是帶來的風險是服務器出現故障時,內存緩衝區中的數據會丟失掉。
  • 文件同步:這個過程是將內存緩衝區中的數據寫入到硬盤中的AOF文件中

Redis中默認執行的是RDB持久化,如何打開AOF持久化呢?咱們先來看看AOF的配置項:

①appendonly:這個參數是AOF的開關,配置成yes能夠打開AOF持久化機制。打開AOF機制後

②appendfsync:咱們知道Redis中有個事件循環,Redis在每一個事件循環都會將aof緩衝區中的內容寫入到操做系統的內存緩衝區。這個參數就是來配置將內存緩衝區中的數據同步到硬盤上的AOF文件中的更新頻率,有always、everysec、no三個配置值。

  • always表示每次執行寫入操做,就會當即將內存緩衝區中的內容同步到磁盤中的AOF文件中。這種配置性能比較差,可是能夠確保數據不丟失。
  • everysec表示每秒執行一次將操做系統的內存緩衝區中的數據同步到磁盤的AOF文件中,這個操做由一個線程來負責,性能很高。
  • no表示由操做系統來控制什麼時候將內存緩衝區中的數據同步到硬盤的AOF文件中。這種操做在服務器出現異常時會丟失一部分數據。

下面說說AOF文件的還原過程,咱們知道AOF文件中存儲的是全部曾經執行過的寫命令,因此服務器只要讀入並從新執行一遍AOF文件裏保存的寫命令,就能夠還原服務器關閉以前的數據庫內容。

同時爲了解決在Redis運行過程當中AOF文件愈來愈大,Redis還提供了AOF重寫功能,關於AOF重寫原理在此不具體介紹,有興趣的咱們能夠私下討論。

3、RDB和AOF區別和聯繫,以及同時工做時的狀況

①首先咱們總結一下兩種方式的區別和聯繫:

RDB持久化:默認開啓;全量備份,一次性保存整個數據庫;體積小,數據恢復快;服務器異常時可能會丟失部分數據;SAVE操做會阻塞,BGSAVE不阻塞

AOF持久化:默認關閉;增量備份,一次保存一個修改數據庫的命令;體積大,數據恢復慢;備份頻率能夠本身設置;不會出現阻塞

②當RDB和AOF同時開始時:

  • 若是RDB在執行snapshotting操做,那麼redis不會執行AOF rewrite; 若是redis在執行AOF rewrite,那麼就不會執行RDB snapshotting
  • 若是RDB在執行snapshotting,此時用戶執行BGREWRITEAOF命令,那麼等RDB快照生成以後,纔會去執行AOF rewrite
  • 同時有RDB snapshot文件和AOF日誌文件,那麼redis重啓的時候,會優先使用AOF進行數據恢復,由於其中的日誌更完整

 

相關文章
相關標籤/搜索