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文件的机制。
相关文章
相关标签/搜索