Redis的持久化机制
对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中
redis支持三种持久化机制
RDB二进制快照、AOF日志持久化、RDB和AOF的混合持久化
RDB持久化
将内存中RDB的数据以二进制格式快照的方式保存到硬盘的RDB文件中
包括save和bgsave指令,redis停机,Save会阻塞主线程,bgsave会创建子进程生成RDB文件。
定期执行快照保存,可能会导致数据丢失。快照持久化,可通过一定时间内数据变化的数量进行持久化。
AOF持久化
AOF:以日志的形式记录每个操作,将操作追加到文件末尾,类似事务日志 记录日志的时间
执行命令之后再记录日志。避免检查语法的开销, 可能会阻塞后续的命令执行。
先写入AOF缓冲区,然后在进行刷盘。
有文件自动重写功能,达到存储最后一次写操作。
AOF文件大和恢复速度可能比RDB慢
AOF记录日志是在主线程中进行的。
AOF的持久化方式
1.write完立即写入磁盘
2.后台线程每秒写入一次磁盘
3.由操作系统决定 写入page cach进行异步刷盘
三种方式区别在于fsync的时机,从系统内核缓冲区保存到磁盘上,即使是第一种方式也有丢失一天数据的可能,如刚执行完命令就宕机
AOF重写
AOF重写是在子进程中进行。重写的过程是读取当前数据库中的所有键值对,然后将每个键值对用一条命令记录到新的AOF文件中,完成后替换现有的AOF文件。重写缓冲区存放重写期间新增的命令日志。
AOF和RDB持久化的区别
| RDB | AOF |
|---|---|
| 文件小 | 直观,可以看到执行的命令 |
| 恢复数据快 | 恢复执行速度慢 |
| 生成RDB文件占用CPU 资源和内存资源 | 追加命令是在主线程中进行的 |
| 容易丢失数据 |
持久化过程中写时复制:减少内存复制带来的性能损耗
在AOF重写以及bgsave实现RDB快照保存时,都会用到写时复制。
RDB和AOF的混合持久化
在AOF日志重写时,保存为RDB文件,重写缓冲区以AOF命令写入。