redis 实现持久化的方式及原理、特点
1、RDB持久化(快照):指定时间间隔内的内存数据集快照写入磁盘
1)fork一个子进程,将快照内容写入临时RDB文件中(dump.rdb),当子进程写完快照内容之后新的文件替换老的文件
2)整个redis数据库只包含一个备份文件
3)性能最大化,只需要fork子进程完成持久化工作,减少磁盘IO
4)持久化之前宕机可能会导致数据丢失
2、AOF持久化 :以日志的形式记录服务器的所有的写、删除操作
1)每接收到一个写的命令用write函数追加到文件appendonly.aof
2)持久化的文件会越来越大,存在大量多余的日志(0 自增100次到100,会产生100条日志记录)
3)可以设置不同的fsync策略
appendfsync everysec :1s一次,最多丢失1s的数据(默认)
appendfsync always :每次变动都会执行一次
appendfsync no :不处理
4)AOF文件太大之后会进行重写:压缩AOF文件大小
fork一个子进程,将redis内地数据对象的最新状态写入AOF临时文件(类似rdb快照)
主进程收到的变动会先写入内存中,然后同步到老的AOF文件中(重写失败之后也能保证数据完整性)
子进程完成重写之后会将内存中的新变动同步追加到AOF的临时文件中
父进程将临时AOF文件替换成新的AOF文件,并重命名。之后收到的新命令写入到新的文件中