当前位置: 首页 > news >正文

Redis之持久化机制和实现原理

Redis之持久化机制和实现原理

redis有两种持久化机制:RDB和AOF。每种持久化机制各有优缺点,了解每种持久化机制的原理对我们使用Redis有很大的帮助。Redis4.0后支持RDB和AOF两种持久化机制混合使用,所以存在三种持久化策略。

 

RDB持久化

RDB(Redis DataBase)是基于快照一次的全量备份,即周期性的把redis当前内存中的全量数据写入到一个快照文件中(周期时间可以通过配置来调整)。

RDB有两种触发方式:自动触发和手动触发。

(1)自动触发:在 redis.conf 配置文件中的 SNAPSHOTTING 下配置save参数,来触发Redis的 RDB 持久化条件,也就是什么时候将内存中的数据保存到硬盘。比如“save m n”:表示m秒内数据集存在n次修改时,自动触发bgsave。

//默认如下配置:
save 900 1:每隔900s(15min),如果有超过1个key发生了变化,就写一份新的RDB文件
save 300 10:每隔300s(5min),如果有超过10个key发生了变化,就写一份新的RDB文件
save 60 10000:每隔60s(1min),如果有超过10000个key发生了变化,就写一份新的RDB文件
(配置多种策略可以同时生效,无论满足哪一种条件都会写一份新的RDB文件)

(2)手动触发:手动生成新的RDB文件,执行Redis的save、bgsave命令。

 

AOF持久化

AOF(Append-only file)日志存储的是redis服务器的顺序指令序列,即对内存中数据进行修改的指令记录。当redis收到客户端修改指令后,先进行参数校验,如果校验通过,先把该指令存储到AOF日志文件中,也就是先存到磁盘,然后再执行该修改指令。

 

 

混合持久化

redis-4.x后支持了RDB和AOF混合使用。重启redis时,我们很少使用RDB来恢复内存状态,因为会丢失大量数据。我们通常使用AOF日志重放,但是重放AOF日志性能相对RDB来说要慢很多,这样在redis实例很大的情况下,启动需要花费很长的时间。redis-4.0为了解决这个问题,带来了一个新的持久化选项——混合持久化。将RDB文件的内容和增量的AOF日志文件存在一起,这里的AOF日志不再是全量 的日志,而是RDB久化开始 到 RDB持久化结束的这段时间发生的增量AOF日志,通常这部分AOF日志很小。redis-4.x混合持久化机制如下图:

redis 持久化机制对比

(1)RDB的优缺点

优点:

RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中redis的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去。

生成RDB文件的时候,主进程不需要进行任何磁盘IO操作。当进行RDB持久化时,对redis服务处理读写请求的影响非常小,可以让redis保持高性能,因为redis主进程只需要fork一个子进程,让子进程执行磁盘IO操作来进行RDB持久化即可。生成一次RDB文件的过程就是把当前时刻内存中的数据一次性写入文件中,而AOF则需要先把当前内存中的小量数据转换为操作指令,然后把指令写到内存缓存中,然后再刷写入磁盘。

RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。AOF存放的是指令日志,做数据恢复的时候,要回放和执行所有的指令日志,从而恢复内存中的所有数据;而RDB,就是一份数据文件,恢复的时候,直接加载到内存中即可。

缺点:

RDB方式数据没办法做到实时持久化/秒级持久化,会导致数据丢失。一般来说,RDB数据快照文件,都是每隔5分钟,或者更长时间生成一次,这个时候就得接受一旦redis进程宕机,那么会丢失最近5分钟的数据。这个问题,也是RDB最大的缺点,就是不适合做第一优先的恢复方案,如果你依赖RDB做第一优先恢复方案,会导致数据丢失的比较多。

RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题(版本不兼容)。

RDB每次在fork子进程来执行RDB快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,甚至数秒。所以一般不要让生成RDB文件的间隔太长,否则每次生成的RDB文件太大了,对redis本身的性能会有影响。

(2)AOF的优缺点

优点:

AOF可以更好的保护数据不丢失,一般AOF会每隔1秒,通过一个后台线程执行一次fsync操作,最多丢失1秒钟的数据。

AOF日志文件以append-only模式(追加)写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复。

AOF日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。因为在rewrite的时候,会对其中的指令进行压缩,会创建出一份需要恢复数据的最小日志出来。

AOF日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用flushall命令清空了所有数据,只要这个时候后台rewrite还没有发生,那么就可以立即拷贝AOF文件,将最后一条flushall命令给删了,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据。

缺点:

对于同一份数据来说,AOF日志文件通常比RDB数据快照文件更大。因为AOF是指令文件,RDB是二进制文件。

AOF的写性能比RDB的写性能低,因为AOF一般会配置成每秒fsync一次日志文件,当然,每秒一次fsync,性能也还是很高的,只不过比起RDB来说性能低,如果要保证一条数据都不丢,也是可以的,AOF的fsync设置成每写入一条数据,fsync一次,但是这样,redis的性能会大大下降。

基于AOF文件做恢复的速度不如基于RDB文件做恢复的速度。

(3)混合持久化的优缺点

优点:结合了RDB和AOF的优点,使得数据恢复的效率大幅提升

缺点:兼容性不好,redis-4.x新增,虽然最终的文件也是.aof格式的文件,但在4.0之前版本都不识别该aof文件,同时由于前部分是RDB格式,阅读性较差。

(4)如何选择redis持久化机制

RDB和AOF到底该如何选择

不要仅仅使用RDB,因为那样会导致丢失很多数据。

也不要仅仅使用AOF,一是数据恢复慢,二是可靠性也不如RDB,毕竟RDB文件中存储的就是某一时刻实实在在的数据,而AOF只是操作指令,把数据转换为操作指令不一定是百分百没问题的。

综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择; 用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复。

(5)AOF和RDB同时工作

redis在写RDB文件的时候不会执行AOF rewrite;redis在执行AOF rewrite的时候不会生成新的RDB。

如果redis正在生成新的RDB文件,此时用户执行bgrewriteaof命令手动重写AOF文件,那么等RDB快照生成之后,才会去执行AOF rewrite。

同时有RDB文件和AOF日志文件,那么redis重启的时候,会优先使用AOF进行数据恢复,因为其中的日志更完整。

参考:Redis有哪几种持久化方式?优缺点是什么_redis持节化有哪几种,他们的优缺点是什么?-CSDN博客

 


http://www.mrgr.cn/news/54650.html

相关文章:

  • unity学习笔记-安装与部署
  • 软件I2C的代码
  • 前端: || 和可选链 ?. 的区别
  • VSCODE c++不能自动补全的问题
  • Python 多线程学习与使用
  • 3.订阅者Subscriber的编程实现以及话题消息定义与使用后续课程
  • C/C++程序员为什么要了解汇编?汇编语言的好处与学习路径详解
  • Python进阶语法
  • Vue request请求拦截 全局拦截Promise后 api请求捕获异常catch
  • day3:管道,解压缩,vim
  • 写一段代码判断素数的函数,从主函数中输出一个整数,判断它是否为素数。
  • ret2reg
  • 分布式缓存的基本概念入门以及如何保证数据一致性
  • Mysql数据库压缩版的卸载、安装及初始化
  • c++ 对象作用域
  • Java 类和对象详解(下)
  • Leetcode 3327. Check if DFS Strings Are Palindromes
  • 【动态规划】【路径问题】下降路经最小和、最小路径和、地下城游戏
  • 15. 三数之和 双指针经典题目
  • 【MySQL】to_date()日期转换
  • 模拟器芯片巨头 ADI 亚德诺半导体 Analog Devices 产品的应用介绍和物料推荐(六)
  • 【软件工程】过程和生命周期的建模
  • Android常用C++特性之std::bind
  • ArkTS 中Tabs 页签内引入页面的 onPageShow和onPageHide 没有执行,是什么原因?怎么解决?
  • python语言入门必须要学习的模块化编程案例游戏---画图案例(三)【源码大全】
  • 前端大佬都在用的useFetcher究竟有多强?