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 文件重写机制
因为每次执行的命令都会被写