Redis
雖然是一種內存型數據庫,一旦服務器進程退出,數據庫的數據就會丟失,爲了解決這個問題Redis
提供了兩種持久化的方案,將內存中的數據保存到磁盤中,避免數據的丟失。redis
工做目錄(redis持久化存儲的目錄):RDB 和 AOF 公用該目錄數據庫
# The working directory. # # The DB will be written inside this directory, with the filename specified # above using the 'dbfilename' configuration directive. # # The Append Only File will also be created inside this directory. # # Note that you must specify a directory here, not a file name. dir /data/spider/Redis_Backup/ #能夠自定義你的目錄,默認爲當前目錄 dir ./
redis
提供了RDB持久化
的功能,這個功能能夠將redis
在內存中的的狀態保存到硬盤中,它能夠手動執行,也能夠再redis.conf
中配置,按期執行。緩存
RDB持久化產生的RDB文件是一個通過壓縮的二進制文件,這個文件被保存在硬盤中,redis能夠經過這個文件還原數據庫當時的狀態。安全
RDB文件
能夠經過兩個命令來生成:服務器
SAVE
:阻塞redis的服務器進程,直到RDB文件
被建立完畢。BGSAVE
:派生(fork)一個子進程來建立新的RDB文件
,記錄接收到BGSAVE
當時的數據庫狀態,父進程繼續處理接收到的命令,子進程完成文件的建立以後,會發送信號給父進程,而與此同時,父進程處理命令的同時,經過輪詢來接收子進程的信號。而RDB文件的載入通常狀況是自動的,redis服務器啓動的時候,redis
服務器再啓動的時候若是檢測到RDB文件的存在,那麼redis會自動載入這個文件。app
若是服務器開啓了AOF持久化
,那麼服務器會優先使用AOF文件來還原數據庫狀態。ide
RDB是經過保存鍵值對來記錄數據庫狀態的,採用copy on write的模式,每次都是全量的備份。this
BGSAVE
能夠在不阻塞主進程的狀況下完成數據的備份。能夠經過redis.conf
中設置多個自動保存條件,只要有一個條件被知足,服務器就會執行BGSAVE
命令。spa
# 如下配置表示的條件: # 服務器在900秒以內被修改了1次 save 900 1 # 服務器在300秒以內被修改了10次 save 300 10 # 服務器在60秒以內被修改了10000次 save 60 10000
AOF持久化
(Append-Only-File),與RDB持久化不一樣,AOF持久化是經過保存Redis服務器鎖執行的寫狀態來記錄數據庫的。操作系統
具體來講,RDB持久化至關於備份數據庫狀態,而AOF持久化是備份數據庫接收到的命令,全部被寫入AOF的命令都是以redis的協議格式來保存的。
在AOF持久化
的文件中,數據庫會記錄下全部變動數據庫狀態的命令,除了指定數據庫的select命令,其餘的命令都是來自client的,這些命令會以追加(append)的形式保存到文件中。
服務器配置中有一項appendfsync
,這個配置會影響服務器多久完成一次命令的記錄:
always
:將緩存區的內容老是即時寫到AOF文件中。everysec
:將緩存區的內容每隔一秒寫入AOF文件中。no
:寫入AOF文件中的操做由操做系統決定,通常而言爲了提升效率,操做系統會等待緩存區被填滿,纔會開始同步數據到磁盤。redis默認實用的是everysec
。
redis在載入AOF文件
的時候,會建立一個虛擬的client,把AOF中每一條命令都執行一遍,最終還原回數據庫的狀態,它的載入也是自動的。在RDB和AOF備份文件都有的狀況下,redis會優先載入AOF備份文件
AOF文件可能會隨着服務器運行的時間愈來愈大,能夠利用AOF重寫的功能,來控制AOF文件的大小。AOF重寫功能會首先讀取數據庫中現有的鍵值對狀態,而後根據類型使用一條命令來替代前的鍵值對多條命令。
AOF重寫功能有大量寫入操做,因此redis才用子進程來處理AOF重寫。這裏帶來一個新的問題,因爲處理從新的是子進程,這樣意味着若是主線程的數據在此時被修改,備份的數據和主庫的數據將會有不一致的狀況發生。所以redis還設置了一個AOF重寫緩衝區,這個緩衝區在子進程被建立開始以後開始使用,這個期間,全部的命令會被存兩份,一份在AOF緩存空間,一份在AOF重寫緩衝區,當AOF重寫完成以後,子進程發送信號給主進程,通知主進程將AOF重寫緩衝區的內容添加到AOF文件中。
#AOF 和 RDB 持久化方式能夠同時啓動而且無衝突。
#若是AOF開啓,啓動redis時會加載aof文件,這些文件可以提供更好的保證。
appendonly yes #默認爲no,開啓AOF持久化的時候,須要設置爲yes
# 只增文件的文件名稱。(默認是appendonly.aof)
# appendfilename appendonly.aof
#redis支持三種不一樣的寫入方式:
#
# no:不調用,之等待操做系統來清空緩衝區當操做系統要輸出數據時。很快。
# always: 每次更新數據都寫入僅增日誌文件。慢,可是最安全。
# everysec: 每秒調用一次。折中。
appendfsync everysec
# 設置爲yes表示rewrite期間對新寫操做不fsync,暫時存在內存中,等rewrite完成後再寫入.官方文檔建議若是你有特殊的狀況能夠配置爲'yes'。可是配置爲'no'是最爲安全的選擇。
no-appendfsync-on-rewrite no
# 自動重寫只增文件。
# redis能夠自動盲從的調用‘BGREWRITEAOF’來重寫日誌文件,若是日誌文件增加了指定的百分比。
# 當前AOF文件大小是上第二天志重寫獲得AOF文件大小的二倍時,自動啓動新的日誌重寫過程。
auto-aof-rewrite-percentage 100
# 當前AOF文件啓動新的日誌重寫過程的最小值,避免剛剛啓動Reids時因爲文件尺寸較小致使頻繁的重寫。
auto-aof-rewrite-min-size 64mb
AOF
更安全,可將數據及時同步到文件中,但須要較多的磁盤IO,AOF文件
尺寸較大,文件內容恢復相對較慢, 也更完整。RDB
持久化,安全性較差,它是正常時期數據備份及 master-slave
數據同步的最佳手段,文件尺寸較小,恢復數度較快。建議:二者都打開,同時用兩種方式持久化