Redis之AOF持久化
Redis提供AOF(Append Only Files)持久化功能,RDB持久化通过保存数据库中键值对来记录数据库的状态,AOF持久化通过保存Redis服务器所执行的写命令来记录数据库状态。
Redis.conf配置
1 | appendfsync yes |
AOF持久化的实现
具体实现可以分为命令追加(append),文件写入,文件同步三个步骤
命令追加
当Redis服务器打开了AOF持久化时,服务器在执行完一个写命令后,会以协议的格式将被执行的写命令追加到服务器状态的aof_buf缓冲区末尾。
AOF文件的写入和同步
使用 AOF 持久化需要设置同步选项,从而确保写命令什么时候会同步到磁盘文件上。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。有以下同步选项:
选项 | 同步频率 |
---|---|
always | 每个写命令都同步 |
everysec | 每秒同步一次 |
no | 让操作系统来决定何时同步 |
- always 选项会严重减低服务器的性能,每个事件循环都要将aof_buf中的内容写入到AOF文件中,但是也是最安全的,因为即使Redis宕机也只会丢失一个事件循环的所有命令数据。
- everysec 选项比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响;
- no 选项并不能给服务器性能带来多大的提升,而且也会增加系统崩溃时数据丢失的数量。
AOF重写
随着保存的命令越来越多,AOF文件中的内容也越来越多,而且AOF文件中的命令很有可能是冗余的,而且数据还原的时间就会越长,这时候就需要重写AOF文件来减小AOF文件的体积。
AOF文件重写的实现
服务器为了保存数据库的状态,其实实际上不是去读取AOF文件来实现重写,而是直接读取数据库的状态,比如读取List的值并且用一条RPUSH list的命令行代替保存在AOF文件中。
AOF后台重写
在执行BGREWRITEAOF命令时,Redis服务器会维护一个AOF重写缓冲区,该缓冲区会在子进程创建AOF文件期间,记录服务器所有的写命令,当子进程完成创建后,服务器会将重写缓冲区中所有的内容追加到AOF的文件末尾。最后服务器会用新的AOF文件替换旧的AOF文件
Redis4.0新功能简介:RDB-AOF混合持久化
Redis用户常常会在RDB和AOF之间陷入两难:
- RDB持久化能够快速的恢复数据,但是在服务器停机时会丢失大量的数据;
- AOF持久化能够有效提高数据的安全性,但是在存储和恢复方面耗费大量的时间;
Redis 4.0 推出了一个能够“鱼和熊掌兼得”的持久化方案 —— RDB-AOF 混合持久化: 这种持久化能够通过 AOF 重写操作创建出一个同时包含 RDB 数据和 AOF 数据的 AOF 文件, 其中 RDB 数据位于 AOF 文件的开头, 它们储存了服务器开始执行重写操作时的数据库状态: 至于那些在重写操作执行之后执行的 Redis 命令, 则会继续以 AOF 格式追加到 AOF 文件的末尾, 也即是 RDB 数据之后。