redis 的持久化
原理:
redIs 是使用内存进行数据缓存的,但是它可以将内存中数据保存到磁盘上
从而实现数据持久保存的目的,
redis 支持两种不同方式的数据持久化保存机制,RDB和AOF
一。RDB 模式
RDB 是基于时间的快照,只保留当前最新的一次快照
特点是执行的速度比较快
缺点是可能丢失数据(从上次快照到当前快照未完成之间的数据)
RDB 实现数据备份的过程:
1》redis 从主进程中先fork 一个子进程,采用写时复制机制
2》子进程将内存中的数据保存为一个临时文件,dump.rdb.temp,当数据保存完成之后再将上次保存的RDB 文件替换掉,
3》关闭子进程
说明:
如果直接替RDB 文件的时候就可能会出现突然断电等问题而导致RDB 文件还么有保存完整就突然关机,从而导致数据的丢失,
可以手动将每次生成的RDB 文件进行备份,这样可以最大化保存历史数据
二
二。RDB 模式的优缺点
优点:
1. RDB 快照保存了某个时间点的数据
可以通过脚本执行bgsave (非阻塞) 或者save (阻塞)命令自定义时间点备份
可以保留多个备份,当出现问题的时候就可以恢复到不同时间点的数据
2.可以最大化IO 的性能
因为父进程再保存RDB 文件的时候唯一要做的是fork 出一个子进程,然后的操作都会由这个子进程操作,父进程无需任何IO
3.RDB 在恢复大量数据的时候比AOF 快
缺点:
1.不能时时保存数据,会丢失一部分数据
2.数据量非常大的时候,从父进程fork 的时候需要一点点时间,可能是毫秒或者秒
三:AoF 模式
原理:
AOF 是安装操作顺序,将指令添加到日志文件中,
特点:是数据安全性相对比较高
缺点:是有些操作是重复的也会全部记录
AOF 和RDB 一样使用了,写时复制机制
AOF 默认是每秒fsync 一次,即使服务器发生故障的话顶多也就丢失1秒钟之内的数据
fsync 会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入AOF 文件的IO 影响
AOF 的文件大小要大于RDB 格式的文件(因为写入重复的数据)