意义
数据恢复、备份
方法
Redis提供了两种持久化方法——RDB和AOF
RDB
思路:快照,保存数据库中的键值对到文件
实现:阻塞和非阻塞两种方式
- 阻塞:服务进程执行持久化操作,持久化期间,服务器不能处理任何命令请求
- 非阻塞:服务进程派生的子进程执行持久化操作,持久化期间,服务器仍然能处理命令请求
– 进程而不是线程,避免持久化与请求之间的互斥问题,但是持久化期间,内存会加倍
问题:两次持久化之间的数据可能丢失
AOF(Append-Only-File)
思路:保存写命令到文件
实现:服务进程先保存写命令,然后再执行写命令
问题:AOF文件体积膨胀的问题
AOF重写
思路:创建新的AOF文件来替代现有的AOF文件
- 读取当前的数据库状态
- 非阻塞:服务进程派生的子进程执行重写操作,而不是服务进程
– 进程而不是线程,避免重写与请求之间的互斥问题 - 重写缓冲区:服务进程派生子进程之后,同时保存写命令到文件和重写缓冲区
- 阻塞:子进程完成重写操作之后,向服务进程发送信号,服务进程先将重写缓冲区中的内容写入到新的AOF文件,然后再替换现有的AOF文件
其它思路
思路1:创建新的AOF文件来替代现有的AOF文件
- 读取当前的数据库状态
- 阻塞:服务进程执行重写操作
思路2:创建新的AOF文件来替代现有的AOF文件
- 分析现有的AOF文件(先拷贝再分析)
- 非阻塞:服务进程派生的子进程执行重写操作
思路3:创建新的AOF文件来替代现有的AOF文件
- 分析现有的AOF文件
- 阻塞:服务进程执行重写操作
思路4:AOF文件按时间或者大小进行组织,重写通过不断合并旧的AOF文件来实现