AOF(Append Of File)通过记录命令的方式来保存数据库状态
AOF实现
Redis服务进程说白了就是个大的事件循环,包括文件事件和时间事件两种。文件事件就是执行各种命令,时间事件是执行一些定时任务。服务循环中每结束一次文件事件都会判断是否要进行AOF的文件写入和同步操作。
AOF的实现分为三个步骤:命令追加 -> 文件写入 -> 文件同步。
- 命令追加:将写命令操作追加到 aof_buf 缓冲区;
- 文件写入:将 aof_buf 缓冲区的内容写入 AOF 文件(但还不一定写入磁盘);
- 文件同步:写入磁盘。
为什么写入 AOF 文件还不是写入磁盘呢?
这是因为操作系统为了优化文件的写入,会在 OS 中做一个缓冲区,当写満或隔一段时间才会同步(flush)到磁盘上。系统提供了命令fsync
和fdatasync
可以强制让系统进行同步。
对于何时将文件同步写入磁盘,Redis配置项 flushAppendOnlyFile
可以控制:
- always:每执行一条进行一次同步;
- everysec:每秒进行一次同步;
- no:何时同步由操作系统决定。
AOF还原数据库状态
AOF还原只需要执行文件中的每一条命令就可以,所以很简单,需要注意的一条是,服务器会创建一个不带网络连接的伪客户端来执行这些命令。
AOF的重写
AOF的重写不是在已有的 AOF 文件上操作的,而是直接从数据库状态中将数据以命令的形式 dump 下来的。需要注意的是,为了避免客户端缓冲区溢出 ,如果元素的数量超过了 64 个,就会分成多段,每段不超过 64 个。
在执行AOF重写时,Redis会创建一个新进程来进行。这样做一是为了不阻塞主进程的执行;二来不是用线程是为了避免使用锁,保证数据安全(子进程带有数据的副本)。重写完后会用新的 AOF 文件原子替换旧的 AOF 文件。
对于 AOF 重写期间数据库进行的写命令。Redis使用了AOF重写缓冲区进行缓存,最后再进行同步。流程是这样的:

网友评论