(六)、Redis的AOF持久化---Redis设计与实现读书笔记
程序员文章站
2024-03-21 11:09:28
...
redisServer关于AOF的数据结构
/**
*Redis 服务器类
*/
struct redisServer{
...
//AOF缓存区
sds aof_buf;
...
}
当服务器执行完一个写命令后,会一协议格式将被执行的写命令追加到服务器类的aof_buf缓存区的末尾。
AOF文件的写入、同步
写入、同步概念
- 写入:为了提高文件的写入效率,操作系统通常会将写入数据暂时保存在内存缓冲区,当缓冲区被填满或超过指定时限后才将缓冲区中的数据写入到磁盘中
- 同步:系统提供了fsync和fdatasync两个同步函数,强制操作系统立即将缓冲区中的数据写入到磁盘中,保证数据的安全性
appendfsync选项
redis中通过服务器配置的appendfsync选项的值来决定(flushAppendOnlyFile函数)从aof_buf缓存区到磁盘的操作方式:
三种选项效率、安全性对比
always:效率最底、最安全
everysec:效率足够快、相对安全,只丢失1秒数据
no:效率最高、最不安全,丢失上次同步到现在的全部数据
AOF数据载入与还原
AOF重写
重写定义
为解决AOF文件不断膨胀问题,通过AOF重写功能,Redis服务器创建一个新的AOD文件来代替现有的AOF文件,新旧两个文件保存的数据库状态相同,但新AOF文件不会包含任何浪费空间的冗余代码。
重写实现原理
从数据中读取键现在的值,然后使用一条命令去记录键值对,代替之前记录这个键值对的多条命令。
重写实现流程
Redis通过子进程来完成AOF的重写,并且Redis服务器为了实现重写功能,设置了"AOF重写缓冲区",当子进程在重写AOF时,Redis服务器执行一条写命令后会同时将这个写命令发送给"AOF缓冲区"和"AOF重写缓冲区"
当子进程完成AOF重写工作后,会调用一个信号处理函数将"AOF重写缓冲区"中的所有内容写入到新的AOF文件中,使得新的AOF文件保存的数据库状态和当前数据库状态保持一致,之后对新的AOF文件进行改名,并且原子地覆盖现有的AOF文件,完成新旧AOF文件的替换。