Redis——RDB持久化

由於Redis是內存數據庫,它將本身的數據庫狀態儲存在內存裏面,因此若是不想辦法將存儲在內存中的數據庫狀態保存到磁盤裏面,那麼一旦服務器進程退出,服務器中的數據庫狀態也會消失不見。redis

爲了解決這個問題,Redis提供了RDB持久化功能,這個功能能夠將Redis在內存中的數據庫狀態保存到磁盤裏面,避免數據意外丟失。數據庫

RDB持久化既能夠手動執行,也能夠根據服務器配置選項按期執行,該功能能夠將某個時間點上的數據庫狀態保存到一個RDB文件中。服務器

RDB持久化功能所生成的RDB文件是一個通過壓縮的二進制文件,經過該文件能夠還原生成RDB文件時的數據庫狀態。app

由於RDB文件是保存在硬盤裏面的,因此即便Redis服務器進程退出,甚至運行Redis服務器的計算機停機,但只要RDB文件仍然存在,Redis服務器就能夠用它來還原數據庫狀態。async

RDB文件的建立與載入

有兩個Redis命令能夠用於生成RDB文件,一個是SAVE,另外一個是BGSAVE。ide

SAVE命令會阻塞Redis服務器進程,直到RDB文件建立完畢爲止,在服務器進程阻塞期間,服務器不能處理任何命令請求。優化

和SAVE命令直接阻塞服務器進程的作法不一樣,BGSAVE命令會派生一個子進程,而後由子進程負責建立RDB文件,服務器進程(父進程)繼續處理命令請求。.net

和使用SAVE命令或者BGSAVE命令建立RDB文件不一樣,RDB文件的載入工做是在服務器啓動時自動執行的,因此Redis沒有專門用於載入RDB文件的命令,只要Redis服務器在啓動時檢測到RDB文件存在,它就不會自動載入RDB文件。code

另外值得一提的是,由於AOF文件的更新頻率一般比RDB文件的更新頻率高,因此:若是服務器開啓了AOF持久化功能,
那麼服務器會優化使用AOF文件來還原數據庫狀態。只有在AOF持久化功能處於關閉狀態時,服務器纔會使用RDB文件來
還原數據庫狀態。

輸入圖片說明

SAVE命令執行時的服務器狀態
    當SVAE命令執行時,Redis服務器會被阻塞,因此當SAVE命令正在執行時,客戶端發送的全部命令請求都會被拒絕。只有在服務器執行完SAVE命令,從新開始接收命令請求以後,客戶端發送的命令纔會被處理。

BGSAVE命令執行時的服務器狀態
    由於BGSAVE命令的保存工做是由子進程執行的,因此在子進程建立RDB文件的
 過程當中,Redis服務器仍然能夠繼續處理客戶端的命令請求,可是,在BGSAVE命令
 執行期間,服務器處理SAVE,BGSAVE,BGREWRITEAOF三個命令的方式會和平時有所
 不一樣。
    首先,在BGSAVE命令執行期間,客戶端發送的SAVE命令會被服務器拒絕。

RDB文件載入時的服務器狀態
    服務器在載入RDB文件期間,會一直處於阻塞狀態,直到載入工做完成爲止。

自動間隔性保存

由於BGSAVE命令能夠在不阻塞服務器進程的狀況下執行,因此Redis容許用戶經過
設置服務器配置的save選項,讓服務器每隔一段時間自動執行一次BGSAVE命令。
用戶能夠經過save選項設置多個保存文件,但只要其中任意一個條件被知足,
服務器就會執行BGSAVE命令。

redis.conf 文件orm

############################## APPEND ONLY MODE ###############################

# By default Redis asynchronously dumps the dataset on disk. This mode is
# good enough in many applications, but an issue with the Redis process or
# a power outage may result into a few minutes of writes lost (depending on
# the configured save points).
#
# The Append Only File is an alternative persistence mode that provides
# much better durability. For instance using the default data fsync policy
# (see later in the config file) Redis can lose just one second of writes in a
# dramatic event like a server power outage, or a single write if something
# wrong with the Redis process itself happens, but the operating system is
# still running correctly.
#
# AOF and RDB persistence can be enabled at the same time without problems.
# If the AOF is enabled on startup Redis will load the AOF, that is the file
# with the better durability guarantees.
#
# Please check http://redis.io/topics/persistence for more information.

appendonly no

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"
?save                                                                      
save 900 1
save 300 10
save 60 10000

輸入圖片說明

輸入圖片說明

重點

  • RDB文件用於保存和還原Redis服務器全部數據庫中的全部鍵值對數據。
  • SAVE命令由服務器進程直接執行保存操做,因此該命令會阻塞服務器。
  • BGSAVE命令由子進程執行保存操做,因此該命令不會阻塞服務器。
  • 服務器狀態中會保存全部用save選項設置的保存條件,當任意一個保存條件被知足
    時,服務器會自動執行BGSAVE命令。
  • RDB文件是一個通過壓縮的二進制文件,由多個部分組成。
  • 對於不一樣類型的鍵值對,RDB文件會使用不一樣的方式來保存它們。

相關資料: http://my.oschina.net/tongyufu/blog/405638

相關文章
相關標籤/搜索