为什么需要持久化,以及Redis持久化的RDB方式在这篇文章讲的已经很透彻了,足以吊打面试官了。而且此篇内容需要RDB文章的内容支持,所以建议先看下:看完这篇还不懂Redis的RDB持久化,你们来打我!

一、什么是AOF

它也是Redis持久化的重要手段之一,aof->Append Only File,只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾。而RDB是压缩成二进制等时机开子进程去干这件事。

二、优缺点

1、优点

  • 持久化的速度快,因为每次都只是追加,rdb每次都全量持久化

  • 数据相对更可靠,丢失少,因可以配置每秒持久化、每个命令执行完就持久化

2、缺点

  • 灾难性恢复的时候过慢,因为aof每次都只追加原命令,导致aof文件过大,但是后面会rewrite,但是相对于rdb也是慢的。

  • 会对主进程对外提供请求的效率造成影响,接收请求、处理请求、写aof文件这三步是串行原子执行的。而非异步多线程执行的。Redis单线程!

三、AOF原理

1、基础原理

就是每次都在aof文件后面追加命令。他与主进程收到请求、处理请求是串行化的,而非异步并行的。图示如下

在这里插入图片描述

所以aof的频率高的话绝逼会对Redis带来性能影响,因为每次都是刷盘操作。跟mysql一样了。Redis每次都是先将命令放到缓冲区,然后根据具体策略(每秒/每条指令/缓冲区满)进行刷盘操作。如果配置的always,那么就是典型阻塞,如果是sec,每秒的话,那么会开一个同步线程去每秒进行刷盘操作,对主线程影响稍小。

2、额外扩展

其实Redis每次在写入AOF缓冲区之前,他都会调用flushAppendOnlyFile(),判断是否需要将AOF缓冲区的内容写入和同步到AOF文件中。这个决策是由配置文件的三个策略来控制的

  • always

  • everysec

  • no

四、REWRITE

1、为什么要rewrite?

比如我有业务很简单,就来回delete set 同一个key。就这个业务运行了10年,那么aof文件将记录无数个delete k1, set k1 xxx。其实都是重复的,但是我aof每次都追加,文件变成了1T大小。这时候Redis宕机了,要恢复,你想想1TB大小的aof文件去恢复,累死了。最主要的是1TB大小只记录了两个命令,所以压缩其实就是来处理这件事的。

2、4.0版本之前的rewrite

Redis4.0之前和Redis4.0的rewrite(重写)方式不一样,Redis4.0之前就是将aof文件中重复的命令给去掉。保留最新的命令。进而减少aof文件大小。比如

set k1 123
set k1 345
del k1
set k1 789

经过rewrite后(Redis4.0之前),只会变成如下

set k1 789

3、4.0版本以及之后的rewrite

4.0之前的做法效率很是低下,需要逐条命令对比。4.0开始的rewrite支持混合模式(也是就是rdb和aof一起用),直接将rdb持久化的方式来操作将二进制内容覆盖到aof文件中(rdb是二进制,所以很小),然后再有写入的话还是继续append追加到文件原始命令,等下次文件过大的时候再次rewrite(还是按照rdb持久化的方式将内容覆盖到aof中)。但是这种模式也是配置的,默认是开,也可以关闭。

4、rewrite触发条件

1、手动触发

  • 客户端执行bgrewriteaof命令

2、自动触发

通过以下两个配置协作触发

auto-aof-rewrite-min-size

AOF文件最小重写大小,只有当AOF文件大小大于该值时候才可能重写,4.0默认配置64mb。

auto-aof-rewrite-percentage

当前AOF文件大小和最后一次重写后的大小之间的比率等于或者等于指定的增长百分比,如100代表当前AOF文件是上次重写的两倍时候才重写。 

3、触发满足条件

  • 没有BGSAVE命令(RDB持久化)/AOF持久化在执行

  • 没有BGREWRITEAOF在进行;

前两点也就是说只允许同时fork()一个子进程出来干活。

  • 当前AOF文件大小要大于server.aof_rewrite_min_size的值;

  • 当前AOF文件大小和最后一次重写后的大小之间的比率等于或者大于指定的增长百分比(auto-aof-rewrite-percentage参数)

5、rewrite原理

4.0之前版本的,和4.0以及之后关闭混合模式的情况下。

在这里插入图片描述
  • aof_rewrite_buf:rewrite(重写)缓冲区、aof_buf:写命令存放的缓冲区

  • 开始bgrewriteaof的时候,判断当前有没有bgsave/bgrewriteaof在执行,若有,则不执行,这个再rdb篇幅也有提到,以及下面很多fork()知识在rdb都有提到。看完这篇还不懂Redis的RDB持久化,你们来打我!

  • 主进程fork()出子进程,在执行fork()这个方法的时候是阻塞的,子进程创建完毕后就不阻塞了

  • 主进程fork完子进程后,主进程能继续接收客户端的请求,所有写命令依然是写入AOF文件缓冲区并根据配置文件的策略同步到磁盘的。

  • 因为fork的子进程仅仅共享主进程fork()时的内存,后期主进程在更改内存数据,子进程是不可见的。因此Redis采取重写缓冲区(aof_rewite_buf)保存fork之后的客户端请求。防止新AOF文件生成期间丢失主进程执行的新命令所生成的数据。所以此时客户端的写请求不仅仅写入原来的aof_buf缓冲区,还写入了重写缓冲区。这就是我为什么用深蓝色的框给他两框到一起的原因。

  • 子进程通过内存快照的形式,开始生成新的aof文件。

  • 新aof文件生成完后,子进程向主进程发信号。

  • 主进程收到信号后,会把重写缓冲区(aof_rewite_buf)中的数据写入到新的AOF文件(主要是避免这部分数据丢失)

  • 使用新的AOF文件覆盖旧的AOF文件,且标记AOF重写完成。

五、RDB-AOF混合持久化

redis4.0之后才支持,默认开启

1、优点

混合持久化结合了RDB持久化 和 AOF 持久化的优点,采取了rdb的文件小易于灾难恢复,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。

2、缺点

兼容性差,一旦开启了混合持久化,在4.0之前版本都不识别该aof文件,同时由于前部分是RDB格式,需要专业的工具来阅读,因为是二进制,所以阅读性较差。

3、原理

需要先掌握看完这篇还不懂Redis的RDB持久化,你们来打我!和此篇幅的aof

混合持久化也是通过bgrewriteaof完成的,所以基本流程和上述一样。不同的是当开启混合模式时,fork出的子进程先将共享的内存副本全量以RDB的方式写入aof。这样提高了速度也极大的缩小了aof文件(毕竟都是二进制)。写完还是通知主进程,然后再将重写缓冲区的内容以AOF方式写入到文件,然后替换旧的aof文件。也就是说这种模式下的aof文件发生rewrite后前半部分是rdb格式(REDIS开头的二进制数据),后半部分是正常的aof追加的命令(重写缓冲区里的)。

4、数据恢复

会优先看是否存在aof文件,若存在则先按照aof文件恢复,因为aof毕竟比rdb全。若aof不存在,则才会查找rdb是否存在。这是默认的机制。毕竟aof文件也rewrite成rdb二进制格式,文件小,易于回复。所以redis会优先采取aof。

六、总结

此篇都是重点,废话很少。没啥可总结的。

一定要看彻底搞懂Redis持久化之RDB原理会让你收获更多,还有,这只是开始,rdb&aof持久化并没完成。二者对比总结篇以及实战篇在向你我招手。

END

Java面试题专栏

【81期】面试官:说说HashMap 中的容量与扩容实现

【82期】面试中被问到SQL优化,看这篇就对了!

【83期】面试被问到了Redis和MongoDB的区别?看这里就对了

【84期】面试中设计模式能问些什么?比如说一下三种单例模式实现

【85期】谈谈Java面向对象设计的六大原则,中高级面试常问!

【86期】五个刁钻的String面试问题及解答

【87期】面试官问:Java序列化和反序列化为什么要实现Serializable接口

【88期】面试官问:你能说说 Spring 中,接口的bean是如何注入的吗?

【89期】面试官 5 连问一个 TCP 连接可以发多少个 HTTP 请求?

【90期】面试官:说一下使用 Redis 实现大规模的帖子浏览计数的思路

我知道你 “在看”

天天在用Redis,那你对Redis的AOF持久化到底了解多少呢?相关推荐

  1. java实现redis缓存_java实现redis缓存功能

    一.安装redis 1.mac安装,如果有安装brew 可以直接快捷安装:brew install redis 2.linux下载安装wget http://download.redis.io/rel ...

  2. 一文深入了解 Redis 内存模型,Redis 的快是有原因的!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:编程迷思 cnblogs.com/kismetv/p/865 ...

  3. redis未能启动服务器,redis服务启动不了的解决办法(服务器应非法关机了)

    1.确认redis没运行.[[email protected] run]# /etc/init.d/kkmail_redis status redis is not running 2.删除pid文件 ...

  4. Redis AOF 持久化详解

    来自公众号:程序员历小冰 Redis 是一种内存数据库,将数据保存在内存中,读写效率要比传统的将数据保存在磁盘上的数据库要快很多.但是一旦进程退出,Redis 的数据就会丢失. 为了解决这个问题,Re ...

  5. Redis入门到精通-Redis高级命令

    2019独角兽企业重金招聘Python工程师标准>>> 高级命令 ​ keys * : 返回满足的所有键 ,可以模糊匹配 ​ exists :是否存在指定的key,存在返回1,不存在 ...

  6. redis集群之REDIS CLUSTER

    redis集群之REDIS CLUSTER 时间 2016-04-11 17:05:00  NoSQL_博客园 原文  http://www.cnblogs.com/zhanchenjin/p/537 ...

  7. redis(3)redis的基础入门(java)

    1.java连接redis Jedis jedis = new Jedis("192.168.1.102", 6379);//报错,拒绝连接 解决方案: 关闭linux防火墙,re ...

  8. ubuntu 下搭建redis和php的redis的拓展

    系统环境: 腾讯云服务器, ubuntu16.0.4.4 ,php7.0 一.安装redis服务 sudo apt-get install redis-server 安装好的redis目录在 /etc ...

  9. [ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器

    原文:[ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器 上一章 [ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis  介绍了Red ...

最新文章

  1. 的确好用!Python数据科学速查表中文版强势来袭!
  2. 实现auto_ptr的两种方法
  3. 跟我一起考PMP---项目时间管理
  4. pidstat 命令查看某个进程的CPU、内存、磁盘使用情况
  5. 数字人民币明确不采用区块链技术,对数字货币投资须保持警惕
  6. mongodb mysql并发_MongoDB:锁和并发控制
  7. MySQL主从复制遇到的问题以及如何解决
  8. keil spi 调试_单片机软件出问题了?有经验的工程师这么调试
  9. 《中国人工智能学会通讯》——11.10 点云局部特征描述子基准评估体系
  10. JavaScript:递归实现深拷贝
  11. FastNetMon 使用笔记
  12. E08【选尺码】I'm looking for size 43
  13. 《Sequence Models》课堂笔记
  14. R packages:fNonlinear———bdsTest——BDS检验
  15. BZOJ 3470: Freda’s Walk
  16. eclipse网络连接代理设置
  17. Redis全部知识总结(概念、安装、用法、数据类型、事务、持久化、Jeids、订阅系统、缓存穿透及雪崩等)
  18. Python03(注释、算术运算符、程序执行原理、变量使用)
  19. 反应式架构:基本概念
  20. 我的奇思妙想隐形的机器人_我的奇思妙想机器人作文

热门文章

  1. “天天快报”涉黄被下架?官方回应:不是我 是山寨版APP
  2. 鸽了!华米科技智能手表部分款将推迟开售 工艺太复杂了
  3. 苹果要做第一个吃螃蟹的人!将率先尝试台积电5nm工艺
  4. 月费10元起!中国移动推年轻人的第一张5G元素电话卡
  5. 黑科技之后迎来“小仙女”!小米官宣全新手机系列CC
  6. 支持色温调节 新款Kindle Oasia上市 国行版售价2399元起
  7. 苏宁张近东:春节期间拿出3亿补贴一线员工
  8. 程序员讨厌领导又不想辞职,用一妙招让领导离职,网友:佩服
  9. 深圳出差 第二天【原创】
  10. 在Cygwin上安装编辑器vim 【ZT】