redis 持久化的两种方式及原理

redis是一个基于内存的缓存程序,即redis是使用内存进行缓存数据,但是可以将内存中的数据按照一定的策略保存到磁盘上,实现数据持久存储,redis支持两种不同方式的数据持久保存机制,分别是RDB和AOF。

RDB模式
基于时间的快照,值保留当前最新的一次快照,优点是执行速度比较快,缺点是可能会丢失从上次快照到当前快照未完成之间的数据。

RDB快照的执行过程
RDB快照的实现过程,redis从主进程fork出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如dump.rdb.tmp,当所有的数据保存完成之后在讲上一次保存的RDB文件替换掉,然后关闭子进程,这样可以保存没错做RDB快照的时候保存的数据都是完整的,因为直接替换了旧的RDB文件的过程中可能出现服务器宕机,断电等问题导致RDB文件还没有保存完整,导致数据丢失的情况,建议使用自动备份工具或者脚本将每次生成的RDB文件在进行备份,最大化保存历史数据。

RDB模式的优缺点
1)RDB快照保存了某个时间点的数据,可以通过脚本执行bgsave(非阻塞)或者save(阻塞)命令自定义时间点备份,同时保留多个备份,当出现故障时恢复到不同时间点的数据。
2)能最大化IO性能,父进程在保存RDB文件的时候唯一要做的是fork出一个子进程,而后的任务都会由子进程完成,父进程无须任何的IO操作。
3)RDB在数据较大的情况下恢复速度比AOF快,比如几个G甚至更大。

AOF模式:

AOF模式持久化数据过程
按照缓冲区的数据记录加入顺序,依次操作添加到指定的日志文件中,优点是数据安全性搞,缺点是重复的记录也会全部记录。
AOF和RDB一样使用了写时复制机制,AOF默认为没秒钟fsync依次,即将执行的命令保存到AOF文件中,即使redis服务器发生故障也只是丢失1秒钟之内的数据,也可以根据实际情况设置不同的fsync策略,或设置每次执行命令的时候执行fsync,fsync会在后台执行线程,所有主线程可以继续处理用的正常请求而不会受到写入AOF文件的IO影响。

AOF模式的优缺点
AOF的持久存储文件大小大于RDB格式文件。
根据定义的fsync策略(fsync是同步内存中的redis所有已经修改的文件到存储设备)默认是appendfsync everysec即每秒执行一次fsync。

你可能感兴趣的:(redis 持久化的两种方式及原理)