文章目录

  • 一、RDB(Redis DataBase)
    • 概述
    • 持久化过程
    • 配置
    • 优势和劣势
  • 二、AOF(Append Of File)
    • 概述
    • AOF持久化过程
    • AOF 配置
    • Rewrite 压缩
    • 优势和劣势
  • 三、RDB和AOF如何选择
    • 官方建议

Redis由于读取效率快而常常被用作缓存来使用,之所以读取的速度非常快,是因为Redis将数据都存储在内存中,我们大家都知道存储在内存中的数据最大的特点就是:断电即丢失,这就容易出现数据不安全的问题。关系型数据库MySQL就是将数据持久化到磁盘上。那么Redis官方也提供了RDBAOF两种方式,可以将数据持久化到磁盘来确保数据的安全性。

官方的截图

一、RDB(Redis DataBase)

概述

在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里。

持久化过程

Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。

  • Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
  • 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,Linux中引入了“写时复制技术
  • 一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

配置

  • dump.rdb : 使用RDB生成的默认文件名称

  • dir ./ : rdb文件的保存路径,默认为Redis启动时命令行所在的目录下

  • stop-writes-on-bgsave-error:当Redis无法写入磁盘的话,直接关掉Redis的写操作。

  • rdbcompression:对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能。

  • rdbchecksum :在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能

  • save:秒钟 写操作次数
    RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件,
    默认是1分钟内改了1万次,或5分钟内改了10次,或15分钟内改了1次。

此处为save配置的一些规则说明(此规则可以进行修改):

  • 3600秒后一个key发生改变进行数据持久化操作

优势和劣势

① 优势:

适合大规模的数据恢复
对数据完整性和一致性要求不高更适合使用
节省磁盘空间
恢复速度快

② 劣势:

Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑。
虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。

二、AOF(Append Of File)

概述

以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。

AOF持久化过程

  1. 客户端的请求写命令会被append追加到AOF缓冲区内;
  2. AOF缓冲区根据AOF持久化策略[always,everysec,no]将操作sync同步到磁盘的AOF文件中;
  3. AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量;
  4. Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的;

AOF 配置

  • AOF 默认是不开启的,需要将其设置为 yes

  • 生成默认的文件名

  • AOF 文件路径默认和dump.rdb路径一致

我们可以看到AOF文件中是没有数据的,连接上redis客户端,发现也是没有数据的。


但是rdm中之前是有数据的。

那么AOF和RDB同时开启,redis听谁的?

其实,AOF和RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)。

  • AOF同步频率设置:
    appendfsync always :始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好
    appendfsync everysec :每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。
    appendfsync no :redis不主动进行同步,把同步时机交给操作系统。

Rewrite 压缩

定义?

AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制, 当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩, 只保留可以恢复数据的最小指令集。

重写原理:

AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),redis4.0版本后的重写,是指上就是把rdb 的快照,以二级制的形式附在新的aof头部,作为已有的历史数据,替换掉原来的流水账操作。
no-appendfsync-on-rewrite=yes ,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)。
no-appendfsync-on-rewrite=no, 还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)。

触发机制?

Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发。重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是有一定的负担的,因此设定Redis要满足一定条件才会进行重写。
auto-aof-rewrite-percentage:设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的2倍时触发)
auto-aof-rewrite-min-size:设置重写的基准值,最小文件64MB。达到这个值开始重写。

重写流程:

  1. bgrewriteaof触发重写,判断是否当前有bgsave或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行。
  2. 主进程fork出子进程执行重写操作,保证主进程不会阻塞。
  3. 子进程遍历redis内存中数据到临时文件,客户端的写请求同时写入aof_buf缓冲区和aof_rewrite_buf重写缓冲区保证原AOF文件完整以及新AOF文件生成期间的新的数据修改动作不会丢失。
  4. (1)子进程写完新的AOF文件后,向主进程发信号,父进程更新统计信息。
    (2)主进程把aof_rewrite_buf中的数据写入到新的AOF文件。
  5. 使用新的AOF文件覆盖旧的AOF文件,完成AOF重写。

优势和劣势

① 优势:

备份机制更稳健,丢失数据概率更低。
可读的日志文本,通过操作AOF稳健,可以处理误操作。

② 劣势:

比起RDB占用更多的磁盘空间。
恢复备份速度要慢。
每次读写都同步的话,有一定的性能压力。

三、RDB和AOF如何选择

官方建议

使用建议:

  • RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
  • AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.
  • Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大
  • 只做缓存:如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
  • 同时开启两种持久化方式
  • 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据。因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
  • RDB的数据不实时,同时使用两者时服务器重启也只会找AOF文件。那要不要只使用AOF呢?
    建议不要,因为RDB更适合用于备份数据库(AOF在不断变化不好备份), 快速重启,而且不会有AOF可能潜在的bug,留着作为一个万一的手段。

性能建议:

  • 因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。
  • 如果使用AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价,一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。
  • 只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。

本次分享的Redis持久化数据之RDB和AOF到这里就结束了,希望对大家有所帮助!!!

Redis持久化数据之RDB和AOF相关推荐

  1. redis 持久化详解 RDB和AOF 优缺点

    本文将先说明上述几种技术分别解决了Redis高可用的什么问题:然后详细介绍Redis的持久化技术,主要是RDB和AOF两种持久化方案:在介绍RDB和AOF方案时,不仅介绍其作用及操作方法,同时介绍持久 ...

  2. Redis持久化机制(RDB VS AOF)

    Redis持久化机制 Redis持久化机制由来 一.RDB机制 1.1 工作原理 1.2 RDB的配置 1.3 修改RDB配置的快照策略 1.3.1 自定义RDB持久化策略 1.3.2 服务宕机RDB ...

  3. Redis持久化、备份:RDB和AOF

    RDB持久化与文件相关配置 1.RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照.简单来说就是把内存中的所有数据都记录到磁盘中.当R ...

  4. Redis持久化中的RDB、AOF以及混合模式

    Redis持久化 1 RDB 在指定的时间间隔内将内存中的数据以快照的形式保存到磁盘 过程: 1 客户端执行bgsave命令,redis主进程收到指令并判断此时是否在执行bgrewriteaof, 如 ...

  5. Redis的持久化开启了RDB和AOF下重启服务是如何加载的?(10个人9个回答错误)

    互联网面试题更新了!随便呈上几道,看看大家能否答出来: redis为什么是key,value的,为什么不是支持SQL的? redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看) r ...

  6. Redis持久化——内存快照(RDB)

    最新:Redis持久化--如何选择合适的持久化方式 最新:Redis持久化--AOF日志 最新:Redis持久化--内存快照(RDB) 一文回顾Redis五大对象(数据类型) Redis对象--有序集 ...

  7. Redis提供的持久化机制(RDB和AOF)

    Redis提供的持久化机制 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却 ...

  8. redis的持久化存储,RDB与AOF

    redis持久化存储支持两种方式:RDB和AOF.RDB一定时间取存储文件,AOF默认每秒去存储历史命令,官方建议两种方式同时使用 没有持久化的redis和memcache一样,相当于一个纯内存的数据 ...

  9. redis rdb aof区别_理解Redis的持久化机制:RDB和AOF

    什么是Redis持久化? Redis作为一个键值对内存数据库(NoSQL),数据都存储在内存当中,在处理客户端请求时,所有操作都在内存当中进行,如下所示: 这样做有什么问题呢? 注 意 文末有:362 ...

最新文章

  1. “造车时代”多方笃定小米造车,网络营销外包专员如何看待这一波营销?
  2. sdut 2088 数据结构实验之栈与队列十一:refresh的停车场
  3. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新
  4. android 自启动列表,Android 机型设置自启动的跳转界面
  5. 上海:加快推进18个新建数据中心项目的建设和投资进度
  6. 解决方案:外域HDFS客户端访问内网HDFS datanode
  7. VTK:图表之VisualizeDirectedGraph
  8. 【linux网络编程】网络字节序、地址转换
  9. 【Android 修炼手册系列内容】
  10. 蚂蚁金服4轮面经(Java研发):G1收集器+连接池+分布式架构
  11. 安卓图标_干货 | 安卓界面系统规范
  12. 易汉博承建的数据库再发Nature子刊
  13. using关键字的用法以及作用
  14. 我在GNU/Linux下使用的桌面环境工具组合
  15. ImageMagick图片转PDF
  16. HandlerSocket + MySQL
  17. Java NIO?看这一篇就够了!
  18. python实现英文新闻摘要自动提取_“关键字”法完成新闻摘要提取
  19. 北大AI公开课 第一讲
  20. 序列化(serialization)。

热门文章

  1. 在vs2008中运行这个就闪退了,,还出不来结果
  2. Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation论文解析(视频超分)
  3. Acwing 1191. 家谱树
  4. 盘点那些改变过世界的代码
  5. html图片显示详情,纯CSS鼠标经过图片视差弹出层显示详情链接按钮特效代码.html...
  6. warning C4183: ‘Cricle‘: member function definition looks like a ctor, but name does not match enclo
  7. 安装小豚当家监控摄像头
  8. python开发前景如何
  9. Jetson Nano开发深度学习实践(六) :工作站(主机)装机-NVIDIA显卡驱动,Cuda,Cudnn
  10. Java之List系列--ArrayList保证线程安全的方法