redis

小林 redis

AOF持久化

image-20250819182928996

redis.conf 配置文件中的 appendfsync 配置项可以有以下 3 种参数可填:

  • Always,这个单词的意思是「总是」,所以它的意思是每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘;
  • Everysec,这个单词的意思是「每秒」,所以它的意思是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,然后每隔一秒将缓冲区里的内容写回到硬盘;
  • No,意味着不由 Redis 控制写回硬盘的时机,转交给操作系统控制写回的时机,也就是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘。

image-20250819183356434

AOF 重写机制

Redis 为了避免 AOF 文件越写越大,提供了 AOF 重写机制,当 AOF 文件的大小超过所设定的阈值后,Redis 就会启用 AOF 重写机制,来压缩 AOF 文件。

也就是合并写命令

AOF 后台重写

Redis 的重写 AOF 过程是由后台子进程 *bgrewriteaof* 来完成的

RDB 快照

  • AOF 文件的内容是操作命令;
  • RDB 文件的内容是二进制数据。

Redis 提供了两个命令来生成 RDB 文件,分别是 savebgsave。他们的区别就在于是否在「主线程」里执行。

RDB 服务器启动时自动执行的。

Redis 还可以通过配置文件的选项来实现每隔一段时间自动执行一次 bgsave 命令,配置:

save 900 1 //900秒1次
save 300 10 //300秒10次
save 60 10000 //60秒10000次

bgsave 快照过程中,如果主线程修改了共享数据,发生了写时复制后,RDB快照保存的是原本的内存数据

RDB 和 AOF 合体

尽管 RDB 比 AOF 的数据恢复速度快,但是快照的频率不好把握:

  • 如果频率太低,两次快照间一旦服务器发生宕机,就可能会比较多的数据丢失;
  • 如果频率太高,频繁写入磁盘和创建子进程会带来额外的性能开销。

混合持久化功能设置成 yes:

aof-use-rdb-preamble yes

使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据