我们知道 Redis 是内存数据库,如果服务器断电,内存上面的数据就会丢失了。这个问题显然怎么解决?

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 文件中,

  • 4
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值