Redis 持久化

Redis有两种持久化方式 RDB和AOF

需要注意:数据的恢复是阻塞操作(此间所到来的任何客户端读写请求都失效)

 

一. RDB 快照(默认)

1.优缺点

  • 执行机制:快照,直接将database中key-value的二进制形式存储到RDB文件中
  • 优点:性能较高(因为是快照,且执行频率比AOF低,而RDB中直接存储的key-value的二进制形式,对于恢复数据也快)
  • 缺点:在Save配置条件之前宕机,此间数据会丢失

2. 主要触发方式(三种):

  • Save命令(同步数据到磁盘上)
  • BGSave命令(异步保存数据到磁盘上,主从同步使用此种机制)
  • 自动生成RDB

通过配置文件对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动进行数据集保存操作。

比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动进行数据集保存操作:

二. AOF文件

1. 优缺点

  • 执行机制:将对数据的每一条增删改命令追加到AOF文件中
  • 优点:数据不容易丢失
  • 缺点:性能较低(每一条增删改操作都要追加到AOF文件,执行频率比RDB要高,而且AOF文件中存储的是命令,所以回复慢)

2.AOF持久化的三种策略

可以通过配置文件配置 Redis 多久才将数据 fsync 到磁盘一次。

  • always: 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
  • everysec: 
    • 每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
    • 推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。
  • no: 将数据交给操作系统来处理,由操作系统来决定什么时候同步数据。更快,也更不安全的选择。

 always、everysec、no对比

命令优点缺点
always不丢失数据IO开销大,一般SATA磁盘只有几百TPS
everysec每秒进行与fsync,最多丢失1秒数据可能丢失1秒数据
no不用管不可控

 

三、RDB-AOF混合持久化

简介

redis4.0相对与3.X版本其中一个比较大的变化是4.0添加了新的混合持久化方式。前面已经详细介绍了AOF持久化以及RDB持久化,这里介绍的混合持久化就是同时结合RDB持久化以及AOF持久化混合写入AOF文件。这样做的好处是可以结合 rdb 和 aof 的优点, 快速加载同时避免丢失过多的数据,缺点是 aof 里面的 rdb 部分就是压缩格式不再是 aof 格式,可读性差。

开启混合持久化

4.0版本的混合持久化默认关闭的,通过aof-use-rdb-preamble配置参数控制,yes则表示开启,no表示禁用,默认是禁用的,可通过config set修改。

混合持久化过程

了解了AOF持久化过程和RDB持久化过程以后,混合持久化过程就相对简单了。

混合持久化同样也是通过bgrewriteaof完成的,不同的是当开启混合持久化时,fork出的子进程先将共享的内存副本全量的以RDB方式写入aof文件,然后在将重写缓冲区的增量命令以AOF方式写入到文件,写入完成后通知主进程更新统计信息,并将新的含有RDB格式和AOF格式的AOF文件替换旧的的AOF文件。简单的说:新的AOF文件前半段是RDB格式的全量数据后半段是AOF格式的增量数据,如下图:

数据恢复

当我们开启了混合持久化时,启动redis依然优先加载aof文件,aof文件加载可能有两种情况如下:

  • aof文件开头是rdb的格式, 先加载 rdb内容再加载剩余的 aof。
  • aof文件开头不是rdb的格式,直接以aof格式加载整个文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值