redis的持久化:redis
目的:將內存中的數據保存到磁盤,在機器宕機或重啓時能夠保證數據不丟失。 說明:建議RDB和AOF同時開啓,若兩者同時開啓,則redis在啓動時優先使用aof文件來恢復數據,若AOF出問題時,咱們能夠動態修改配置文件,將AOF關閉,而後使用RDB來恢復。 持久化的方式: RDB(Redis DataBase) 1)概念:當符合必定條件時,redis會自動將內存中的數據進行快照而且存儲到磁盤上,即在指定目錄(默認是當前目錄)下生成一個dump.rdb文件;redis啓動後經過讀取rdb文件,將數據再次載入到內存中。 2)快照的過程: 1>redis複製當前進程獲得一個當前進程的副本,當前進程即父進程,當前進程的副本即子進程。 2>父進程繼續接收並處理客戶端發出的請求,子進程開始將內存中的數據寫到磁盤的一個臨時文件中。 3>當子進程把全部的數據都寫到臨時文件中後,用這個臨時文件替換掉以前的rdb文件。 3)配置文件redis.conf: # 設置觸發快照的條件(Will save the DB if both the given number of seconds and the given number of write operations against the DB occurred.) # 格式:save <seconds> <changes> save 900 1 # 900秒內,若是有1個以上(包括1個)的key被修改了,則觸發快照。 save 300 10 # 300秒內,若是有10個以上(包括10個)的key被修改了,則觸發快照。 save 60 10000 # 300秒內,若是有10000個以上(包括10000個)的key被修改了,則觸發快照。 # RDB默認會開啓,關閉RDB方式的持久化 save "" # 設置rdb文件的名稱(The filename where to dump the DB ) dbfilename dump.rdb # 設置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. dir ./ # 設置rdb文件是否進行壓縮,默認爲yes。注:壓縮rdb文件能夠減小磁盤空間的佔用,可是須要消耗額外的cpu。 rdbcompression yes 4)說明: 1>RDB是redis默認的持久化方案。 2>通常狀況下1G的rdb文件載入到內存的時間大概爲20~30秒。 3>若想在不知足條件的狀況下觸發快照,則能夠經過 SAVE命令(主進程進行快照,故會阻塞其它的請求) 或 BGSAVE命令(子進程進行快照,不會阻塞其它請求) 來手動觸發快照。 4>在執行flushall命令、shutdown命令後也會觸發快照。 eg:執行flushall命令:先清空內存中的數據,而後觸發快照,由於數據已經被清空了,故rdb文件中是沒有數據的! 5>修改完配置文件redis.conf後,重啓redis服務使配置生效:./redis-server redis.conf 5)注意: redis將當前進程的副本做爲子進程,故子進程佔用的內存空間與父進程相同。 即:若父進程是8G內存,那麼在備份的時候必須保證機器有16G的內存,不然的話會啓用虛擬內存,致使reds的性能下降。 6)優勢: 1>適合大規模的數據恢復。 2>若是業務對數據完整性和一致性要求不高,那麼RDB是很好的選擇。 7)缺點: 1>備份時佔用內存,執行備份工做的子進程須要佔用同主進程相同大小的內存,故最好在內存空間較爲充足的時間(eg:半夜)下持久化redis中的數據。 2>數據的完整性和一致性不高,由於RDB可能在最後一次備份時宕機了。 AOF(Append Only File) 1)概念:將發送到redis服務端的每一條寫操做都存儲到磁盤上,即在指定目錄(默認是當前目錄)下生成一個appendonly.aof文件,而且將每次的寫操做追加到aof文件的末尾;redis啓動後經過讀取aof文件,將aof文件中的寫操做依次再執行一遍。 2)更新日誌(aof文件)的過程: 1>由觸發更新aof的條件來觸發更新操做。 2>由觸發重寫aof的條件來觸發重寫操做。 重寫aof文件的目的:去除數據的中間執行過程,保留最終數據的命令,以減少aof文件的大小。 重寫aof文件的過程:redis建立一個子進程,子進程讀取內存中的數據並寫到一個臨時文件中,最後用臨時文件替換掉現有的aof文件。 3)配置文件redis.conf: # AOF和RDB能夠同時存在,AOF方式的持久化擁有更好的數據完整性和一致性。 # 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. # 開啓AOF (AOF默認是關閉的appendonly no) appendonly yes # 設置觸發更新aof文件的條件 # appendfsync always # 同步持久化,即每次執行寫操做後都會去更新aof文件。數據完整性好,可是性能較差。 appendfsync everysec # 每秒同步一次,是AOP默認觸發更新日誌的條件。 # appendfsync no # 不主動同步,由操做系統來決定何時同步(通常爲30s),性能最好可是持久化得不到保障,故不推薦使用該配置。 # 設置觸發重寫aof文件的條件,多個條件是"與"的關係。 # redis在重寫aof文件後會將aof文件的大小記錄下來(若沒有重寫過aof文件,則這個大小默認是redis啓動時aof文件的大小) auto-aof-rewrite-percentage 100 # 當前aof文件的大小 超過 上一次重寫後記錄的大小 的 100%。 auto-aof-rewrite-min-size 64mb # 當前aof文件大於等於64mb。注通常不會設置的這麼小,看狀況設爲ngb比較合理。 # 設置aof文件的名稱(The name of the append only file (default: "appendonly.aof")) # appendfilename appendonly.aof # 設置redis的工做目錄,即rdb文件、aof文件所在的目錄 dir ./ 4)說明: 1>手動觸發重寫aof文件:BGREWRITEAOF 2>若aof文件格式異常,則須要修復aof文件:redis-check-aof --fix appendonly.aof 5)優勢:數據的完整性和一致性更高。 6)缺點:AOF記錄的內容多,文件會愈來愈大,數據恢復也會愈來愈慢,故redis在AOF中引入了重寫aof文件的機制。