写点什么

【Redis 实战】Redis 的两种持久化机制 RDB 和 AOF,java 开源项目集成百度地图

作者:MySQL神话
  • 2021 年 11 月 28 日
  • 本文字数:2055 字

    阅读完需:约 7 分钟

二、持久化流程




持久化,简单来说是指将 Redis 保存在内存中的所有数据保存到磁盘上。


具体的过程如下:


(1)客户端向服务端发送写操作(数据在客户端的内存中)。


(2)数据库服务端接收到写请求的数据(数据在服务端的内存中)。


(3)服务端调用 write 这个系统调用,将数据往磁盘上写(数据在系统内存的缓冲区中)。


(4)操作系统将缓冲区中的数据转移到磁盘控制器上(数据在磁盘缓存中)。


(5)磁盘控制器将数据写到磁盘的物理介质中(数据真正落到磁盘上)。


三、持久化的方式




Redis 提供两种方式进行持久化,一种是 RDB 持久化(原理是将 Reids 在内存中的数据库记录定时 dump 到磁盘上的 RDB 持久化),另外一种是 AOF(append only file)持久化(原理是将 Reids 的操作日志以追加的方式写入文件)。

1、RDB 机制

RDB 持久化方式能够在指定的时间间隔能对你的数据进行快照存储。


RDB 的优点


  • RDB 是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去 24 小时内的数据,同时每天保存过去 30 天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集。

  • RDB 是一个紧凑的单一文件,很方便传送到另一个远端数据中心或者亚马逊的 S3(可能加密),非常适用于灾难恢复。

  • RDB 在保存 RDB 文件时父进程唯一需要做的就是 fork 出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他 IO 操作,所以 RDB 持久化方式可以最大化 redis 的性能。

  • 与 AOF 相比,在恢复大的数据集的时候,RDB 方式会更快一些。


RDB 的缺点


  • 如果你希望在 redis 意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么 RDB 不适合你。虽然你可以配置不同的 save 时间点(例如每隔 5 分钟并且对数据集有 100 个写的操作),是 Redis 要完整的保存整个数据集是一个比较繁重的工作,你通常会每隔 5 分钟或者更久做一次完整的保存,万一在 Redis 意外宕机,你可能会丢失几分钟的数据。

  • RDB 需要经常 fork 子进程来保存数据集到硬盘上,当数据集比较大的时候,fork 的过程是非常耗时的,可能会导致 Redis 在一些毫秒级内不能响应客户端的请求。如果数据集巨大并且 CPU 性能不是很好的情况下,这种情况会持续 1 秒,AOF 也需要 fork,但


《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


是你可以调节重写日志文件的频率来提高数据集的耐久度。

2、AOF 机制

AOF 优点


  • 使用 AOF 会让你的 Redis 更加耐久,你可以使用不同的 fsync 策略:无 fsync、每秒 fsync、每次写的时候 fsync。使用默认的每秒 fsync 策略,Redis 的性能依然很好(fsync 是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失 1 秒的数据。

  • AOF 文件是一个只进行追加的日志文件,所以不需要写入 seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用 redis-check-aof 工具修复这些问题。

  • Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。

  • AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export) AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。


AOF 缺点


  • 对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。

  • 根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。


四、RDB 和 AOF 到底该如何选择?



如何快速更新自己的技术积累?

  • 在现有的项目里,深挖技术,比如用到 netty 可以把相关底层代码和要点都看起来。

  • 如果不知道目前的努力方向,就看自己的领导或公司里技术强的人在学什么。

  • 知道努力方向后不知道该怎么学,就到处去找相关资料然后练习。

  • 学习以后不知道有没有学成,则可以通过面试去检验。


我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!


以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目




本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

MySQL神话

关注

还未添加个人签名 2021.11.12 加入

还未添加个人简介

评论

发布
暂无评论
【Redis实战】Redis的两种持久化机制RDB和AOF,java开源项目集成百度地图