RDB & AOF
RDB 持久化保存数据库状态的方法是将键值对保存在RDB文件中,而AOF持久化保存数据库状态的方式是将命令保存到AOF文件中
AOF 的实现
AOF 持久化功能的实现可以分为append/文件写入/文件同步(sync)
命令追加 AOF
struct redisServer{
//...
// AOF 缓冲区
sds aof_buf;
//..
}
文件写入和同步
Redis 的 appendfsync 值产生的不同的持久化行为
- always:aof_buf 缓冲区中的所有内容写入并同步到AOF文件
- everysec: 每秒一操作
- no: 内容写入AOF文件,但不对其进行同步。
AOF 重写-解决AOF文件膨胀
为了解决AOF文件膨胀问题,Redis提供了AOF文件重写(rewrite)功能。通过该功能,Redis服务器可以创建一个新的AOF文件来代替现有AOF文件,新旧文件保存的数据库状态一直,但是新的AOF文件不会包含任何浪费空间冗余命令。
为了避免在执行命令时造成客户端输入缓冲区溢出。当重写程序在处理列表、哈希表、集合、有序集合这四种可能会带有多个元素的键时,会先检查键所包含的元素数量。超过一定值(默认64)将使用多条命令来记录键的值。
AOF 后台重写
AOF 重写是使用的 aof_rewrite 函数,通过子线程进行重写(问题:在子线程重写时主线程还在不断修改,使得数据不一致)
解决数据不一致:Redis服务器设置了一个AOF重写缓冲区,这个缓冲区在创建子线程后开始使用,当redis服务器执行完一个写命令后,会同时将这个写命令发送给AOF缓冲区和AOF重写缓冲区。
当子线程完成AOF重写工作之后,他会像父进程发送一个信号,父进程在接到该信号之后,会调用一个信号处理函数,将AOF重写缓冲区的所有内容写入到AOF文件中。