【Redis】——AOF持久化

这篇具有很好参考价值的文章主要介绍了【Redis】——AOF持久化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是AOF日志

  • AOF日志是redis为数据的持久化提供了的一个技术,日志里面记录着执行redis写命令。
  • 每当redis执行一条写命令的时候,就会将该命令记录 到AOF日志当中
  • 当redis启动的时候,可以加载AOF日志中的所有指令,并执行这些指令恢复所有的数据。

【Redis】——AOF持久化,redis数据库,redis,数据库,缓存

在 Redis 中 AOF 持久化功能默认是不开启的,需要我们修改 redis.conf 配置文件中的以下参数:

【Redis】——AOF持久化,redis数据库,redis,数据库,缓存

Redis 是先执行写操作命令后,才将该命令记录到 AOF 日志里的 :

优点:先执行写操作命令再记录日志的话,只有在该命令执行成功后,才将命令记录到 AOF 日志里,这样就不用额外的检查开销,不会出现语法错误等问题,保证记录在 AOF 日志里的命令都是可执行并且正确的

缺点:执行写操作命令和记录日志是两个过程,那当 Redis 在还没来得及将命令写入到硬盘时,服务器发生宕机了,这个数据就会有丢失的风险

【Redis】——AOF持久化,redis数据库,redis,数据库,缓存

写入AOF日志的过程

【Redis】——AOF持久化,redis数据库,redis,数据库,缓存

  1. Redis 执行完写操作命令后,会将命令追加到 server.aof_buf 缓冲区;
  2. 然后通过 write() 系统调用,将 aof_buf 缓冲区的数据写入到 AOF 文件,此时数据并没有写入到硬盘,而是拷贝到了内核缓冲区 page cache,等待内核将数据写入硬盘

 redis.conf 配置文件中的 appendfsync 配置项可以有以下 3 种参数可填:

  • Always,这个单词的意思是「总是」,所以它的意思是每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘
  • Everysec,这个单词的意思是「每秒」,所以它的意思是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,然后每隔一秒将缓冲区里的内容写回到硬盘
  • No,意味着不由 Redis 控制写回硬盘的时机,转交给操作系统控制写回的时机,也就是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘。

Always 策略的性能比较差,可靠性高,尽可能保证数据不会丢失

Everysec策略性能适中,宕机会丢失一秒的数据

No策略性能良好,宕机会丢失较多的数据

AOF重写机制

AOF 日志是一个文件,随着执行的写操作命令越来越多,文件的大小会越来越大。

其中AOF日志中

Redis 为了避免 AOF 文件越写越大,提供了 AOF 重写机制,当 AOF 文件的大小 超过所设定的阈值后,Redis 就会启用 AOF 重写机制,来压缩 AOF 文 件。

AOF重写机制

读取当前数据库中的所有键值对,然后将每一个键值对用一条命令记录到「新的 AOF 文件」

作用:

  • 尽管某个键值对被多条写命令反复修改最终也只需要根据这个「键值对」当前的最新状态,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令,这样就减少了 AOF 文件中的命令数量。最后在重写工作完成后。
  • 最后在重写工作完成后,将新的 AOF 文件覆盖现有的 AOF 文件。

【Redis】——AOF持久化,redis数据库,redis,数据库,缓存

为什么重写 AOF 的时候,不直接复用现有的 AOF 文件,而是先写到新的 AOF 文件再覆盖过去?

如果 AOF 重写过程中失败了,现有的 AOF 文件就会造成污染,可能无法用于恢复使用。

AOF后台重写

当 触发 AOF 重写时,比如当 AOF 文件大于 64M 时,就会对 AOF 文件进行重写,这时是需要读取所有缓存的键值对数据,并为每个键值对生成一条命令,然后将其写入到新的 AOF 文件,重写完后,就把现在的 AOF 文件替换掉。这个过程其实是很耗时的,所以重写的操作不能放在主进程

所以,Redis 的 重写 AOF 过程是由后台子进程 bgrewriteaof 来完成的,这样做有两个作用:

  • 子进程进行 AOF 重写期间,主进程可以继续处理命令请求,从而避免阻塞主进程;
  • 父进程 使用fork 创建子进程时,父子进程是共享内存数据的,不过这个共享的内存只能以只读的方式,而当父子进程任意一方修改了该共享内存,就会发生「写时复制」,所以子进程在执行后台重写是不影响父进程

子进程是怎么拥有主进程一样的数据副本的呢?

当父进程 使用fork 创建子进程的时候,会将父进程中的页表 复制给子进程,因此父子进程它们的共享一块物理内存。

【Redis】——AOF持久化,redis数据库,redis,数据库,缓存

写时复制顾名思义,在发生写操作的时候,操作系统才会去复制物理内存,这样是为了防止 fork 创建子进程时,由于物理内存数据的复制时间过长而导致父进程长时间阻塞的问题。

重写子进程只会对这个内存进行只读,重写 AOF 子进程会读取数据库里的所有数据,并逐一把内存数据的键值对转换成一条命令,再将命令记录到重写日志(新的 AOF 文件)

重写 AOF 日志过程中,如果主进程修改了已经存在 key-value,此时这个 key-value 数据在子进程的内存数据就跟主进程的内存数据不一致了,这时要怎么办呢?

Redis 设置了一个 AOF 重写缓冲区,这个缓冲区在创建 bgrewriteaof 子进程之后开始使用

在重写 AOF 期间,当 Redis 执行完一个写命令之后,它会同时将这个写命令写入到 「AOF 缓冲区」「AOF 重写缓冲区」。

【Redis】——AOF持久化,redis数据库,redis,数据库,缓存

 当子进程完成 AOF 重写工作扫描数据库中所有数据,逐一把内存数据的键值对转换成一条命令,再将命令记录到重写日志)后,会向主进程发送一条信号。

主进程收到该信号后,会调用一个信号处理函数,该函数主要做以下工作:文章来源地址https://www.toymoban.com/news/detail-639837.html

  • 将 AOF 重写缓冲区中的所有内容追加到新的 AOF 的文件中,使得新旧两个 AOF 文件所保存的数据库状态一致;
  • 新的 AOF 的文件进行改名,覆盖现有的 AOF 文件。

到了这里,关于【Redis】——AOF持久化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis持久化【RDB+AOF】持久化双雄

    这是redis系列文章之《redis持久化【RDB+AOF】持久化双雄》,上一篇文章【redis基础】redis的十大数据类型_努力努力再努力mlx的博客-CSDN博客 感谢大家的支持~ 目录 RDB 什么是RDB RDB的作用 配置文件关于RDB部分  6vs7 操作步骤 修改配置文件(本案例设置5s修改2次) 修改dump文件的保

    2024年02月08日
    浏览(74)
  • 【Redis】——AOF持久化

    AOF日志是redis为数据的持久化提供了的一个技术,日志里面记录着执行redis写命令。 每当r edis执行一条写命令的时候,就会将该命令记录 到AOF日志当中 。 当redis启动的时候,可以加载AOF日志中的所有指令,并执行这些指令恢复所有的数据。 在 Redis 中 AOF 持久化功能默认是不开

    2024年02月13日
    浏览(48)
  • Redis 持久化——AOF

    使用 RDB 持久化有一个风险,它可能会造成最新数据丢失的风险。因为 RDB 的持久化有一定的时间间隔,在这个时间段内如果 Redis 服务意外终止的话,就会造成最新的数据全部丢失。 可能会操作 Redis 服务意外终止的条件: 安装 Redis 的机器停止运行,蓝屏或者系统崩溃; 安装

    2024年01月22日
    浏览(43)
  • Redis两种持久化方案RDB持久化和AOF持久化

    Redis持久化 Redis有两种持久化方案: RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件

    2024年02月14日
    浏览(53)
  • 全面解析 Redis 持久化:RDB、AOF与混合持久化

    前言: 每次你在游戏中看到玩家排行榜,或者在音乐应用中浏览热门歌单,有没有想过这个排行榜是如何做到实时更新的?当然,依靠 Redis 即可做到。 在技术领域,我们经常听到 「键值存储」 这个词。但在 Redis 的世界里,这只是冰山一角。Redis 的对象,不仅仅是简单的数据

    2024年03月10日
    浏览(63)
  • redis 持久化 RDB + AOF

    RDB(Redis DataBase)和AOF(Append Only File) RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上 AOF,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

    2024年02月03日
    浏览(58)
  • 【Redis】Redis持久化机制RDB与AOF

    目录 一、RDB 1、概念 2、RDB文件保存 3、执行RDB 4、触发RDB 5、fork原理 6、RDB的缺点 二、AOF 1、概念 2、开启AOF 3、触发AOF 4、触发重写AOF 三、区别 RDB全称为Redis Database Backup File(Redis数据备份文件),也叫做Redis数据快照。简单的来说就是把某一时刻Redis内存里的数据都记录到磁

    2024年02月08日
    浏览(54)
  • 【征服redis8】Redis的AOF持久化

    Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF(Append Only File)机制是一种常用的持久化方式,它记录了所有对 Redis 数据库进行修改的命令,在 Redis 重启时可以使用这些命令来重构数据库状态。  目录 1.AOF的

    2024年01月19日
    浏览(44)
  • 【Redis】Redis持久化之AOF详解(Redis专栏启动)

    📫作者简介:小明java问道之路, 2022年度博客之星全国TOP3 ,专注于后端、中间件、计算机底层、架构设计演进与稳定性建工设优化。文章内容兼具广度深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。          📫 热衷分享,喜欢原

    2024年02月02日
    浏览(36)
  • Redis_持久化(AOF、RDB)

    目前,redis的持久化主要应用AOF(Append Only File)和RDF两大机制,AOF以日志的形式来记录每个写操作(增量保存),将redis执行过的所有指令全部安全记录下来(读操作不记录)。只许追加文件,但不可以改写文件,redis启动之初,会读取该文件,重新构建数据。 AOF默认不开启

    2024年02月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包