Redis持久化机制

持久化的方式
RDB(snapshot)持久化
	snapshot,因为生成的文件是.rdb形式结尾的,所以这种方式成为RDB
	RDB是对redis中的数据执行周期性的持久化,原理是将redis在内存中的数据库记录定时dump到磁盘的RDB持久化
	一般来说都是5分钟读一次
特性:
	fork一个进程,遍历hash table,利用copy on write,把整个db dump保存下来。
	save,shutdown,slave命令会触发这些操作。
	粒度比较大,如果save,shutdown,slave之前crash了,则中间的操作无法恢复。
AOF(append only file)持久化
AOF机制是对每条写入命令作为日志,以append-only的模式写入一个日志文件中,在redis重启的时候,也可以通过AOF日志中的写入指令来重新构建整个数据集。
一般是1秒读
特性:
	把写操作的指令持续性的写入一个类似日志的文件中,(类似于从postgresql等数据库导出sql一样,只记录写操作)
	粒度较小,crash之后,只有crash之前没来得及做日志的操作没办法恢复
AOF重写机制
1、手动client触发
	输入bgrewriteraof指令
2、配置server自动触发
	第733 734行 当前显示的是默认的值
	auto-aof-rewrite-percentage 100 后续AOF重写机触发时机 aof文件到达前一次文件的100%触发AOF重写
	auto-aof-rewrite-min-size 64mb  第一次AOF重写机制触发时机,当AOF文件达到64MB时自动触发
AOF重写原理
注意:重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,替换原有的aof文件。
1、redis调用fork,现在有父子两个进程,子进程根据数据状态生成快照,往临时文件中写入重建数据库状态的命令
2、父进程继续处理client请求,除了把原来的写命令写进原来的aof文件中,同时把收到的命令缓存起来,这样就能保证如果子进程重写失败的话并不会出问题
3、当子进程把快照以命令的方式写入到临时文件中,子进程发信号通知父进程,父进程把缓存的写命令也写入到临时文件
4、父进程把临时文件替换原始aof文件,并重命名,后面收到的写命令也会写入新的aof文件中

总结:
	重写过程中,不会读取旧的aof文件,主进程fork子进程快照转换当前数据,生成一个临时文件,主进程继续处理请求,同时追加原aof文件,并缓存新的写命令,最后用临时文件+缓存命令替换原有的aof文件,实现aof重写。
持久化机制的优缺点
RDB
    优点
        RDB是紧凑的二进制文件,比较适合备份,全量复制等场景
        数据恢复速度快于AOF
    缺点
		RDB无法实现实时的持久化
		不同的版本之间无法兼容RDB格式
AOF
    优点
        可以更好的保护数据不丢失
        append-only模式写入性能比较高
        适合做灾难性的误删除紧急恢复
    缺点
    	同一份文件,AOF比RDB大
    	AOF开启之后,会对写的QPS有所影响,相对于RDB写的QPS会下降
    	数据恢复速度比较慢,适合做冷备
持久化的底层如何实现
redis默认开启RDB
在redis.conf 中 save设置触发快照持久化的时机.

在200行的位置存在save <seconds><changes>
save 900 1 (15分钟内一次写操作) 默认使用bgsave命令
save 300 10 (5分钟10次写操作) 默认使用bgsave命令
save 60 10000 (1分钟内有10000次写操作) 默认使用bgsave命令

在253行修改快照的名字
dbfilename dump.rdb
在263行修改文件生成的位置 (dir ./表示启动redis服务命令的当前目录)
dir ./

bgsave
当客户端接收到bgsave命令时,redis会调用fork来创建一个子进程负责将快照写入磁盘中,父进程继续处理请求。
特点:创建子进程完成快照,初始和主进程使用相同的内存,client发出写操作后会再次分配内存。
好处:1、保证redis服务一直可用;2、完成快照效率高

save
接收到save命令的redis服务器在快照创建完毕之前不受任何其他命令的影响。
特点:不会创建子进程,由主进程完成快照
好处:创建快照效率高
缺陷:创建快照时redis无法对外提供服务

redis默认不开启AOF持久化
在redis.conf 中设置是否开启AOF,默认日志文件的名字appendonly.aof
第672行
将appendonly no 改为yes 开启日志持久化

aof日志追加频率
always 	 每写一个命令追加一次日志文件
everysec 每秒追加一次日志文件
no       由操作系统决定
修改702行 appendfsync everysec 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值