- Redis 中数据的持久化
- 前言
- AOF 持久化
- 什么是 AOF 持久化
- 为什么要后记录日志呢
- AOF 的潜在风险
- AOF 文件的写入和同步
- AOF 文件重写机制
- AOF 的数据还原
- RDB 持久化
- 什么是 RDB 持久化
- RDB 如何做内存快照
- 快照时发生数据修改
- 多久做一次快照
- 过期的键如何持久化
- 总结
Redis 中数据的持久化
◆ 前言
我们知道 Redis 是内存数据库,所有操作都在内存上完成。内存的话,服务器断电,内存上面的数据就会丢失了。这个问题显然是需要解决的。
Redis 中引入了持久化来避免数据的丢失,主要有两种持久化的方式 RDB 持久化和 AOF 持久化。
◆ AOF 持久化
什么是 AOF 持久化
AOF(Append Only File):通过保存数据库执行的命令来记录数据库的状态。
AOF日志对数据库命令的保存顺序是,Redis 先执行命令,把数据写入内存,然后才记录日志。
为什么要后记录日志呢
1、后写,能够避免记录到错误的命令。因为是先执行命令,后写入日志,只有命令执行成功了,命令才能被写入到日志中。
2、避免阻塞当前的写操作,是在命令执行后才记录日志,所以不会阻塞当前的写操作。
AOF 的潜在风险
- 1、如果命令执行成功,写入日志的时候宕机了,命令没有写入到日志中,这时候就有丢失数据的风险了,因为这时候没有写入日志,服务断电之后,这部分数据就丢失了。
这种场景在别的地方也很常见,比如基于 MQ 实现分布式事务,也会出现业务处理成功 事务消息发送失败
这种场景,RabbitMQ,RocketMQ,Kafka 事务性,消息丢失和消息重复发送的处理策略
- 2、AOF 的日志写入也是在主线程进行的,如果磁盘的压力很大,写入速度变慢了,会影响后续的操作。
这两种情况可通过调整 AOF 文件的写入磁盘的时机来避免
AOF 文件的写入和同步
AOF 文件持久化的功能分成三个步骤,文件追加(append),文件写入,文件同步(sync)。
AOF 文件在写入磁盘之前是先写入到 aof_buf 缓冲区中,然后通过调用 flushAppendOnlyFile 将缓冲区中的内容保存到 AOF 文件中。
写入的策略通过 appendfsync 来进行配置
- Always:同步写回 每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘;
- Everysec:每秒写回 每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,然后每隔一秒将缓冲区里的内容写回到硬盘;
- No:操作系统控制的写回 Redis 不在控制命令的写会时机,交由系统控制。每次写操作命令执行完成之后,命令会被放入到 AOF 文件的内核缓冲区,之后什么时候写入到磁盘,交由系统控制。
AOF 文件重写机制
因为每次执行的命令都会被写入到 AOF 文件中,随着系统的运行,越来越多的文件会被写入到 AOF 文件中,这样 AOF 文件势必会变得很大,这种情况该如何去处理呢?
为了解决这种情况,Redis 中引入了重写的机制
什么是重写呢?
因为 AOF 文件中记录的是每个命令的操作记录,举个