Redis持久化机制

目录

1、持久化机制有哪些

优缺点

使用场景

2、AOF日志是如何实现的?

为什么先执行命令,再把数据写入日志呢?

AOF 写回策略有几种?

3、RDB 快照是如何实现的呢?

RDB做快照时会阻塞线程吗?


1、持久化机制有哪些

Reids的持久化机制主要有两种

一种是 RDB 快照,指使⽤快照的形式将内存中的全部数据写⼊到磁盘中,存的是非常紧凑经过压缩的数据⽂件。

⼀种是 AOF ⽇志,指以追加的形式,⼀条⼀条地将操作命令写⼊到 AOF ⽇志中

优缺点

  • 占用内存空间
    • RDB存的是压缩过的数据集,占用空间更小
    • AOF 存的是每条操作命令,占用空间更大
  • 速度方面:
    • RDB 存储慢:周期性备份, 每次都是内存中的全部数据,但恢复时更快
    • AOF 存储快: 追加的形式⼀条条地写⼊,每次写⼊⼀条指令,但恢复时更慢(需执行全部指令)
  • 安全性
    • RDB 是周期性备份, 可能会丢失没来得及备份的数据
    • 根据策略⽽定,可以记录全部数据的操作过程,更可靠
  • 资源消耗方面
    • RDB 会造成 IO 压⼒,数据集⽐较⼤时可能会阻塞正常的服务进程
    • AOF 每次记录⼀条,消耗资源更低

使用场景

  • 关闭持久化:数据不敏感,且可以从其他地方重新生成
  • RDB:数据集较大、备份、恢复数据和迁移数据等场景,可以承受数分钟级别的数据丢失
  • AOF:适合用于数据可靠要求高、数据恢复稳健等场景

2、AOF日志是如何实现的?

Redis 在执行完一条写操作命令后,就会把该命令以追加的方式写入到一个文件里,然后 Redis 重启时,会读取该文件记录的命令,然后逐一执行命令的方式来进行数据恢复。

为什么先执行命令,再把数据写入日志呢?

Reids 是先执行写操作命令后,才将该命令记录到 AOF 日志里的,这么做其实有两个好处

  • 避免额外的检查开销:因为如果先将写操作命令记录到 AOF 日志里,再执行该命令的话,如果当前的命令语法有问题,那么如果不进行命令语法检查,该错误的命令记录到 AOF 日志里后,Redis 在使用日志恢复数据时,就可能会出错。
  • 不会阻塞当前写操作命令的执行:因为当写操作命令执行成功后,才会将命令记录到 AOF 日志。

当然,这样做也会带来风险:

  • 数据可能会丢失: 执行写操作命令和记录日志是两个过程,那当 Redis 在还没来得及将命令写入到硬盘时,服务器发生宕机了,这个数据就会有丢失的风险。
  • 可能阻塞其他操作: 由于写操作命令执行成功后才记录到 AOF 日志,所以不会阻塞当前命令的执行,但因为 AOF 日志也是在主线程中执行,所以当 Redis 把日志文件写入磁盘的时候,还是会阻塞后续的操作无法执行。

AOF 写回策略有几种?

Redis 写入AOF日志过程

  1. Redis 执行完写操作命令后,会将命令追加到 server.aof_buf 缓冲区;
  2. 然后通过 write() 系统调用,将 aof_buf 缓冲区的数据写入到 AOF 文件,此时数据并没有写入到硬盘,而是拷贝到了内核缓冲区 page cache,等待内核将数据写入硬盘;
  3. 具体内核缓冲区的数据什么时候写入到硬盘,由内核决定。

3、RDB 快照是如何实现的呢?

因为 AOF 日志记录的是操作命令,不是实际的数据,所以用 AOF 方法做故障恢复时,需要全量把日志都执行一遍,一旦 AOF 日志非常多,势必会造成 Redis 的恢复操作缓慢。

为了解决这个问题,Redis 增加了 RDB 快照。所谓的快照,就是记录某一个瞬间东西,比如当我们给风景拍照时,那一个瞬间的画面和信息就记录到了一张照片。

所以,RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。

因此在 Redis 恢复数据时, RDB 恢复数据的效率会比 AOF 高些,因为直接将 RDB 文件读入内存就可以,不需要像 AOF 那样还需要额外执行操作命令的步骤才能恢复数据。

RDB做快照时会阻塞线程吗?

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

  • 执行了 save 命令,就会在主线程生成 RDB 文件,由于和执行操作命令在同一个线程,所以如果写入 RDB 文件的时间太长,会阻塞主线程
  • 执行了 bgsave 命令,会创建一个子进程来生成 RDB 文件,这样可以避免主线程的阻塞

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

Redis 的快照是全量快照,也就是说每次执行快照,都是把内存中的「所有数据」都记录到磁盘中。所以执行快照是一个比较重的操作,如果频率太频繁,可能会对 Redis 性能产生影响。如果频率太低,服务器故障时,丢失的数据会更多。

  • 64
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值