redis
AOF持久化
在 redis.conf
配置文件中的 appendfsync
配置项可以有以下 3 种参数可填:
- Always,这个单词的意思是「总是」,所以它的意思是每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘;
- Everysec,这个单词的意思是「每秒」,所以它的意思是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,然后每隔一秒将缓冲区里的内容写回到硬盘;
- No,意味着不由 Redis 控制写回硬盘的时机,转交给操作系统控制写回的时机,也就是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘。
AOF 重写机制
Redis 为了避免 AOF 文件越写越大,提供了 AOF 重写机制,当 AOF 文件的大小超过所设定的阈值后,Redis 就会启用 AOF 重写机制,来压缩 AOF 文件。
也就是合并写命令
AOF 后台重写
Redis 的重写 AOF 过程是由后台子进程 *bgrewriteaof* 来完成的
RDB 快照
- AOF 文件的内容是操作命令;
- RDB 文件的内容是二进制数据。
Redis 提供了两个命令来生成 RDB 文件,分别是 save
和 bgsave
。他们的区别就在于是否在「主线程」里执行。
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 格式的增量数据