redis的持久化:

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文件的機制。
相關文章
相關標籤/搜索