(六)、Redis的AOF持久化---Redis设计与实现读书笔记

redisServer关于AOF的数据结构

/**
 *Redis 服务器类
 */
struct redisServer{
    ...
    //AOF缓存区
    sds aof_buf;
    ...
}

当服务器执行完一个写命令后,会一协议格式将被执行的写命令追加到服务器类的aof_buf缓存区的末尾。

AOF文件的写入、同步

写入、同步概念

  • 写入:为了提高文件的写入效率,操作系统通常会将写入数据暂时保存在内存缓冲区,当缓冲区被填满或超过指定时限后才将缓冲区中的数据写入到磁盘中
  • 同步:系统提供了fsync和fdatasync两个同步函数,强制操作系统立即将缓冲区中的数据写入到磁盘中,保证数据的安全性

appendfsync选项

redis中通过服务器配置的appendfsync选项的值来决定(flushAppendOnlyFile函数)从aof_buf缓存区到磁盘的操作方式:
(六)、Redis的AOF持久化---Redis设计与实现读书笔记_第1张图片

三种选项效率、安全性对比

always:效率最底、最安全
everysec:效率足够快、相对安全,只丢失1秒数据
no:效率最高、最不安全,丢失上次同步到现在的全部数据

AOF数据载入与还原

(六)、Redis的AOF持久化---Redis设计与实现读书笔记_第2张图片

AOF重写

重写定义

为解决AOF文件不断膨胀问题,通过AOF重写功能,Redis服务器创建一个新的AOD文件来代替现有的AOF文件,新旧两个文件保存的数据库状态相同,但新AOF文件不会包含任何浪费空间的冗余代码。

重写实现原理

从数据中读取键现在的值,然后使用一条命令去记录键值对,代替之前记录这个键值对的多条命令。

重写实现流程

Redis通过子进程来完成AOF的重写,并且Redis服务器为了实现重写功能,设置了"AOF重写缓冲区",当子进程在重写AOF时,Redis服务器执行一条写命令后会同时将这个写命令发送给"AOF缓冲区"和"AOF重写缓冲区"
(六)、Redis的AOF持久化---Redis设计与实现读书笔记_第3张图片

当子进程完成AOF重写工作后,会调用一个信号处理函数将"AOF重写缓冲区"中的所有内容写入到新的AOF文件中,使得新的AOF文件保存的数据库状态和当前数据库状态保持一致,之后对新的AOF文件进行改名,并且原子地覆盖现有的AOF文件,完成新旧AOF文件的替换。

你可能感兴趣的:(redis,redis,AOF持久化)