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文件的机制。