首页 > 数据库 >Redis 的 AOF 重写机制

Redis 的 AOF 重写机制

时间:2023-07-01 18:02:44浏览次数:36  
标签:AOF 文件 Redis 内存 进程 重写

Redis 的 AOF 重写机制

AOF 持久化机制简介

  • AOF(Append Only File)是一种持久化机制,它将 Redis 的写操作以日志的形式记录在文件中,以保证数据的安全性和可恢复性 。
  • AOF 持久化机制的优点有以下几个 :
    • 可以保证数据的完整性,即使发生系统崩溃或者断电,也可以通过 AOF 文件恢复数据
    • 可以根据不同的同步策略(always、everysec、no)来平衡数据安全性和性能
    • 可以方便地查看和修改 AOF 文件,因为它是一个纯文本文件,记录了所有的写入命令
  • AOF 持久化机制的缺点有以下几个 :
    • 随着写操作的增加,AOF 文件会变得越来越大,占用更多的磁盘空间和网络带宽
    • AOF 文件过大会影响 Redis 的启动和关闭速度,以及数据恢复速度
    • AOF 文件过大会增加 Redis 的内存消耗和 CPU 负载,因为需要 fork 出子进程来进行持久化或者重写操作

AOF 重写机制的原理

  • 为了解决 AOF 文件过大的问题,Redis 引入了 AOF 重写机制,它可以压缩和优化 AOF 文件的内容,减少冗余和无效的命令,提高数据的存储效率和恢复速度 。
  • AOF 重写机制的原理是根据 Redis 进程内的数据生成一个新的 AOF 文件,只包含当前有效和存在的数据的写入命令,而不是历史上所有的写入命令 。
  • AOF 重写机制是通过 fork 出一个子进程来完成的,子进程会扫描 Redis 的数据库,并将每个键值对转换为相应的写入命令,然后写入到一个临时文件中 。
  • 在子进程进行 AOF 重写的过程中,主进程还会继续接收和处理客户端的请求,如果有新的写操作发生,主进程会将这些写操作追加到一个缓冲区中,并通过管道通知子进程 。
  • 子进程在完成 AOF 重写后,会将缓冲区中的写操作也追加到临时文件中,然后向主进程发送信号,通知主进程可以切换到新的 AOF 文件了 。
  • 主进程在收到子进程的信号后,会将缓冲区中的写操作再次追加到临时文件中(以防止在此期间有新的写操作发生),然后用临时文件替换旧的 AOF 文件,并关闭旧的 AOF 文件 。

AOF 重写机制的触发方式

  • AOF 重写机制可以由用户手动触发,也可以由系统自动触发 。
  • 用户手动触发 AOF 重写机制可以通过执行 BGREWRITEAOF 命令来实现 。
  • 系统自动触发 AOF 重写机制可以通过配置文件中的 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 参数来控制 。
  • auto-aof-rewrite-percentage 参数表示当当前 AOF 文件大小超过上次重写后 AOF 文件大小的百分比时,触发 AOF 重写机制,默认值为 100 。
  • auto-aof-rewrite-min-size 参数表示当当前 AOF 文件大小超过指定值时,才可能触发 AOF 重写机制,默认值为 64 MB 。
  • 系统自动触发 AOF 重写机制还需要满足以下条件 :
    • 当前没有正在执行 BGSAVE 或 BGREWRITEAOF 的子进程
    • 当前没有正在执行 SAVE 的主进程
    • 当前没有正在进行集群切换或故障转移

AOF 重写机制可能遇到的问题

  • AOF 重写机制可能会遇到内存不足或者内存碎片化的问题 。
  • 内存不足是指当 fork 出子进程时,操作系统会为子进程分配和主进程相同大小的内存空间,如果主进程占用的内存过大,可能导致内存不足而 fork 失败 。
  • 内存碎片化是指当 fork 出子进程时,操作系统会使用写时复制(copy-on-write)的技术,只有当主进程修改了内存页时,才会为子进程复制一个新的内存页 。但是如果主进程使用了大页(huge page)的特性,那么每次复制的内存页也会很大,可能导致内存碎片化而 fork 失败 。
  • 解决内存不足或者内存碎片化的问题的方法有以下几种 :
    • 增加物理内存或者虚拟内存
    • 优化 Redis 的数据结构和编码,减少内存占用
    • 关闭大页(huge page)的特性,避免复制过大的内存页
    • 使用 Redis 4.0 及以上版本,利用 rdb-preamble 特性,将 RDB 文件写入到 AOF 文件开头,以加快数据恢复速度

总结

  • AOF 重写是一种优化 Redis 的 AOF 持久化机制的方法,它可以压缩和优化 AOF 文件的内容,提高 Redis 的性能和稳定性
  • AOF 重写的原理是根据 Redis 进程内的数据生成一个新的 AOF 文件,只包含当前有效和存在的数据的写入命令
  • AOF 重写是通过 fork 出一个子进程来完成的,子进程会扫描 Redis 的数据库,并将每个键值对转换为相应的写入命令,然后写入到一个临时文件中
  • 在子进程进行 AOF 重写的过程中,主进程还会继续接收和处理客户端的请求,如果有新的写操作发生,主进程会将这些写操作追加到一个缓冲区中,并通过管道通知子进程
  • 子进程在完成 AOF 重写后,会将缓冲区中的写操作也追加到临时文件中,然后向主进程发送信号,通知主进程可以切换到新的 AOF 文件了
  • 主进程在收到子进程的信号后,会将缓冲区中的写操作再次追加到临时文件中(以防止在此期间有新的写操作发生),然后用临时文件替换旧的 AOF 文件,并关闭旧的 AOF 文件
  • AOF 重写机制有其优势和局限性,需要根据实际情况选择合适的触发方式,检查内存占用情况,关闭大页特性,使用 rdb-preamble 特性,定期检查 AOF 文件的大小和内容

标签:AOF,文件,Redis,内存,进程,重写
From: https://www.cnblogs.com/shoshana-kong/p/17519636.html

相关文章

  • Redis持久化之 混合持久化
    Redis混合持久化什么是混合持久化混合持久化是在AOF持久化的基础上,定期进行RDB持久化,以保证数据的快速恢复混合持久化的实现方式是在AOF重写时,将RDB文件以二进制压缩格式写入到AOF文件的开头,之后的数据再以AOF格式追加到文件的末尾3混合持久化的优点是:可以减......
  • Redis群集​
    在centos01安装配置ntp服务器,Centos到centos06配置同步时间,在centos01到centos06安装redis服务器在centos02到centos06修改配置文件开启群集功能,查看节点监听发端口信息在centos01配置redis复制群集查看群集状态,添加删除群集节点,转移卡槽信息修改服务器配置文件重新时间服务器从red......
  • Redis数据结构——快速列表(quicklist)1
    Redis数据结构——快速列表(quicklist)一、什么是quicklistquicklist是Redis3.2版本以后针对链表和压缩列表进行改造的一种数据结构,是zipList和linkedList的混合体,相对于链表它压缩了内存。进一步的提高了效率。quicklist其实就是简单的双链表,但每个双链表节点中保存......
  • Redis数据结构——快速列表(quicklist)
    Redis数据结构——快速列表(quicklist)一、什么是quicklistquicklist是Redis3.2版本以后针对链表和压缩列表进行改造的一种数据结构,是zipList和linkedList的混合体,相对于链表它压缩了内存。进一步的提高了效率。quicklist其实就是简单的双链表,但每个双链表节点中保存......
  • 多端全栈项目实战:大型商业级代驾业务全流程落地SpringCloudAlibaba+Mysql+Redis+Docke
    多端全栈项目实战:大型商业级代驾业务全流程落地SpringCloudAlibaba+Mysql+Redis+Docker+Uniapp+Vue3随着移动互联网的快速发展和智能手机的普及,代驾服务成为了一个日益火热的行业。在这个行业中,如何构建一个具备商业级可靠性和扩展性的代驾业务系统成为了关键问题。本文将介绍一......
  • 使用Redis时的vm.overcommit_memory内存分配控制
    最近在使用Redis的时候遇到了linux系统中的vm.overcommit_memory参数设置,对此不是很了解,于是研究了一下,有了本文。 ===================================== 一个尝试,如何在内存中申请空间:>>>100000*400000*8/1024/1024/1024298.0232238769531 实际代码:importnumpyas......
  • 一天吃透Redis面试八股文
    内容摘自我的学习网站:topjavaer.cnRedis连环40问,绝对够全!Redis是什么?Redis(RemoteDictionaryServer)是一个使用C语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis的数据是存在内存中的,所以读写速度非常快,被广泛应用于缓存方向。Redis可以将数据写入磁......
  • redis自写工具类
    redisDao.javapackagecom.example.demo.dao;/***@Date2023/7/1-9:11*/publicinterfaceredisDao{//存储验证码booleansave(Stringtelephone,Stringcode);//获取验证码StringgetCode(Stringtelephone);//存储token......
  • Redis Desktop Manager(Redis可视化工具)安装及使用教程
    RedisDesktopManager(Redis可视化工具)安装及使用教程2、一、工具/材料官网下载:https://redisdesktop.com/download百度网盘:https://pan.baidu.com/s/15xVRpCT8mkP2uT8PoBHT3g提取码:v727二、方法/步骤1.说明RedisDesktopManager是一款简单快速、跨平台的Redis桌面管理工具,也被......
  • redis核心
    一、Redis是什么?Redis是一个key-value存储系统,它支持存储的value类型相对更多,包括string、list、set、zset(sortedset--有序集合)和hash。二、Redis都有哪些使用场景?Redis是基于内存的nosql数据库,可以通过新建线程的形式进行持久化,不影响Redis单线程的读写操作通过list取最新......