单机数据库实现——AOF持久化
除了RDB持久化之外,Redis还提供了AOF持久化的功能,与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化十通过保存Redis服务器所执行的写命令来记录数据库的状态的。
AOF持久化的实现
AOF持久化功能的实现可以分为命令追加(append),文件写入,文件同步三个步骤。
一,命令追加
当AOF持久化功能处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。意思就是当每次有一个新命令出现的时候所有命令都会排成一个队列的模式一样全部记录(因此AOF也可以看做是日志信息的记录)
二,AOF文件的写入与同步
Redis的服务器进程就是一个事件循环(loop),这个循环中的文件事件负责接收客户端的命令请求,以及向客户端发送命令回复,而时间事件则负责执行像serverCron函数这样需要定时执行运行的函数。因为服务器在处理文件时可能会执行写命令,因此在服务器每次结束一个事件循环之前都会进行一次刷新调用flushAppendOnlyFile函数。
AOF文件的载入与数据还原
因为AOF文件里面包含了重建数据库状态所需的所有写命令,所以服务器只要读入并重新执行一遍AOF文件里面保存的写命令,就可以还原服务器关闭之前的数据库状态。
AOF重写
因为AOF持久化是通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件中的内容就会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的AOF文件很可能对Redis服务器,甚至整个宿主计算机造成影响,并且AOF文件的体积越大,使用AOF文件来进行数据还原所需的时间就越多。
PS:AOF重写的实现可以去阅读以下其他资料
但是在这里简单说一下思路,设计一个常量,如果列表,哈希表,集合,有序集合这四种可能带有多种元素的键超过了这个常量的时候,就会执行一个新的操作(就是分多条命令来记录这些键的值)来记录这些键的值