Redis的持久化(新)

Redis中数据都保存在内存,但是内存中的数据变换很快,也很容易丢失,比如连接断开、宕机停机等等。而Redis提供的数据持久化 机制有RDB(Redis DataBase)AOF(Append Only File)

1.RDB

RDB是指在指定的时间间隔内将内存中的数据集快照写入到磁盘 中,也是默认 的持久化的方式,利用数据快照,使用的是写时复制 技术,将数据以二进制的格式保存在磁盘。

1.1触发快照的时机(save)

1.1.1手动触发

手动触发分别对应save和bgsave命令:

  • save命令:阻塞当前Redis服务,去做持久化操作,直到RDB持久化过程完成为止,不推荐使用。

  • bgsave命令:redis进程执行fork操作创建子进程,子进程负责RDB持久化,完成后子进程自动结束,而且原进程的阻塞只发生在fork阶段。

1.1.2自动触发

利用save进行相关配置,我们进入到redis.conf文件中,其中Save m n就表示若在m秒里面至少进行了n次数据更改时会自动执行bgsave

我们将需要持久化的数据写入磁盘中保存,磁盘中的文件名为dump.rdb,和bin在同一个目录,redis启动时,就是读取dump.rdb文件将数据加载进内存中的。文件的名字可在redis.conf文件里面进行修改。

注意

  1. 如果只开启了rdb,通过shutdown save命令断开Redis的连接时,也会自动执行bgsave。

  2. 在调试级别(debug)中重新启动Redis时,不会清空内存中的数据,这意味着原有的RDB文件仍然有效,即使未执行保存操作。

  3. 当Redis执行全量复制(主从复制)时,如果没有执行save或bgsave命令并且没有添加配置策略,主节点会自动生成RDB文件,并传输给从节点进行数据同步。

1.2RDB持久化和数据恢复的完整流程(bgsave)

当需要进行持久化时,Redis会单独创建一个子进程 来完成持久化操作,这个子进程中所有的数据都和原进程保持一致,而且是一个全新的进程,也会占用内存,这个操作也称为Fork

此时原进程不进行任何操作,由其子进程完成数据的持久化,子进程会先将快照数据写入到一个临时的文件,等到数据写完了之后,再用这个临时的文件直接替换磁盘上的dump.rdb文件即可。

但是缺点是如果子进程正在将数据写入临时文件,此时突然宕机,无法将临时文件替换dump.rdb,下次启动后,恢复后的内存数据较与宕机之前相比就会丢失一部分。

发现整个过程中,原进程是不进行任何IO操作的,这就确保了极高的性能。

1.3RDB方式的优劣分析

1.3.1优点
  • 恢复数据速度快。

  • 节省磁盘空间(二进制格式存储)。

1.3.2缺点
  • fork的时候,会占用内存空间。

  • 可能会丢失数据,不适用于数据一致性高的场景。

2.AOF

日志 的形式来记录每个更改 的操作,不会记录读 的操作,只允许追加而不允许改写。在redis重启或启动之初会读取该文件然后重新构建Redis数据库的数据,这样也不用害怕内存数据的丢失了。

AOF方式Redis默认是不开启 的,如果要开启则需要在配置文件中修改,若AOF和RDB同时开启,系统默认选择用AOF来恢复数据 ,AOF在磁盘中保存的日志文件是"appendonly.aof",文件的路径和RDB一致。

2.1AOF同步频率策略

  • appendsync always :表示每次的修改都会立刻记入磁盘日志文件,性能较差但是能保证数据的一致性。

  • appendsync everysec (默认) :每一秒执行一次数据同步,但可能会在临界点丢失数据。

  • appendfsync no:redis不主动进行同步,把同步时机交给操作系统。

2.2Rewrite压缩

因为AOF采用的是追加写入的方式,为了避免磁盘AOF文件越来越大,新增了重写 机制,当文件默认达到128MB时,Redis就会自动进行AOF文件的内容压缩,保留能达到最终结果的最小指令集。

2.2.1重写的整体流程梳理(自动的)
  1. 主进程fork一个子进程去执行重写的操作,主进程正常运行不会阻塞。

  2. 主进程执行的写操作要同时写入AOF缓冲区和AOF_rewrite缓冲区,此时子进程遍历内存数据将自己压缩的指令集先存储到临时文件(新AOF文件),之后向主进程发送信号。

    注意:这里AOF缓冲区是否要根据同步策略将数据同步到磁盘AOF文件中?

    可以进行设置。如果同步,那么数据安全一致性,但是性能会比较低。如果不同步,若此时宕机,会造成数据丢失,但是性能比较高。

  3. 主进程把AOF_rewrite缓冲区中的数据写入到临时文件中。

  4. 使用临时文件(新AOF文件)覆盖旧的AOF文件,完成AOF重写。

2.3AOF持久化和数据恢复的完整流程

  1. 写操作命令先会被追加写入到AOF缓冲区内。

  2. AOF缓冲区根据同步频率策略将缓冲区数据同步到磁盘AOF文件中。

  3. 看磁盘AOF文件大小是否超过阈值,判断要不要rewrite重写。

  4. 如果Redis宕机,重启服务时,会加载AOF文件来进行数据恢复。

2.4AOF文件出现损坏

如遇到AOF文件损坏,通过.........../bin/redis-check-aof--fix appendonly.aof进行恢复。恢复后重启Redis服务即可。

2.5AOF方式的优劣分析

2.4.1优点
  • 备份机制更加的稳健,丢失数据概率更低。

  • 可读的日志文件。

2.4.2缺点
  • 相比RDB占用更多的磁盘空间。

  • 恢复数据相比RDB更慢。

  • 如果每次写操作都同步,对性能要求较高。

  • AOF文件可能出现损坏,需要手动修复。

相关推荐
你知道“铁甲小宝”吗丶7 分钟前
【第33章】Spring Cloud之SkyWalking服务链路追踪
java·spring boot·spring·spring cloud·skywalking
coffee_baby19 分钟前
化繁为简:中介者模式如何管理复杂对象交互
java·spring boot·microsoft·交互·中介者模式
ღ᭄ꦿ࿐Never say never꧂23 分钟前
微服务架构中的负载均衡与服务注册中心(Nacos)
java·spring boot·后端·spring cloud·微服务·架构·负载均衡
所待.38324 分钟前
小小扑克牌算法
java·算法
.生产的驴32 分钟前
SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
java·javascript·spring boot·后端·rabbitmq·负载均衡·java-rabbitmq
.生产的驴32 分钟前
SpringBoot 消息队列RabbitMQ在代码中声明 交换机 与 队列使用注解创建
java·spring boot·分布式·servlet·kafka·rabbitmq·java-rabbitmq
idealzouhu1 小时前
Java 并发编程 —— AQS 抽象队列同步器
java·开发语言
听封1 小时前
Thymeleaf 的创建
java·spring boot·spring·maven
写bug写bug1 小时前
6 种服务限流的实现方式
java·后端·微服务