【Redis从入门到进阶】第 8 讲:Redis 持久化之 —— AOF

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

本文已收录于专栏
🍅《Redis从入门到进阶》🍅

专栏前言

   本专栏开启,目的在于帮助大家更好的掌握学习Redis,同时也是为了记录我自己学习Redis的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁等。希望大家有问题也可以一起沟通,欢迎一起学习,对于专栏内容有错还望您可以及时指点,非常感谢大家 🌹。

1. Redis 的持久化

   Redis的数据大家都知道是存储在内存中的,这也是它访问速度快的原因,但内存都有一个致命的缺点,如果不小心咔擦一下断电或者关机重启,那么内存当中的数据就全没了,Redis显然也逃不掉。
  Redis的官方显然为了解决这个问题准备了方案,那就是进行持久化,将数据备份到硬盘当中,当重启的时候再从硬盘中获取数据,而官方提供有两种方案可选,一种是AOF,另一种叫RDB,两种方法各有优劣,具体的选择还得看应用场景。

【Redis从入门到进阶】第 8 讲:Redis 持久化之 —— AOF

2. AOF

  AOF全程叫做 Append Only File(追加文件),Redis中每一个写的命令都会被它记录在AOF文件中,可以看做是一个命令日志文件,注意读的指令不会记录,因为对数据持久化没有意义。每当Redis重启后,就可以读取AOF文件的操作指令并执行,以此来达到恢复数据的目的

【Redis从入门到进阶】第 8 讲:Redis 持久化之 —— AOF

3.AOF的开启

  在RedisAOF模式是默认不开启的,我们需要去redis.config中修改参数将其开启:
【Redis从入门到进阶】第 8 讲:Redis 持久化之 —— AOF
当我们的AOP开启后,指令就会默认存储到这个appendonly.aof的文件中。当然从前面的流程图可以看出
我们的Redis是先执行命令,再将命令写入AOF文件中的。这样有什么好处呢?

  • 1 . 避免额外检查开销
    因为我们是先执行命令后写日志,这样错误的命令就不会被写入到日志中,也就节省了语法检查的开销。

  • 2 .不阻塞执行命令
    写磁盘文件是一个比较耗时的操作,如果都先写入磁盘再执行命令,那么大量的命令就会被阻塞住,影响效率。而先执行命令再写,就可以异步来进行写操作,不会影响Redis的执行效率。

  而Redis也确实是如此做的, 我们的指令会先以某种特定的协议格式(RESP协议,Redis客户端和服务器交互的协议)写入到服务器的aof_buf缓冲区当中,而AOF会根据某种策略把缓冲区中的指令同步向磁盘。

  当然上述操作也并不是没有弊端,它存在以下缺点:

    1. 数据丢失风险
      因为是先执行指令,再写入缓冲区,显然如果Redis还没来得及写入磁盘服务器就宕机了,那么这个数据就会丢失了。
    1. 阻塞下一条指令
      假设第一条指令进来,先执行,执行完毕后再将指令写入磁盘的话,如果服务器I/O特别大,此时写入磁盘特别慢,那这时候再来第二条指令就会被阻塞住了。因为这两种操作都是主线程来进行的。

4.写回策略的选择

  这时有一个问题我们必须思考,究竟什么时候把缓冲区的指令同步到磁盘上呢?如果太频繁,大量的I/O会影响服务器性能,如果同步太晚,服务器宕机又怕丢失大量的数据,所以Redis提供了三个等级的写回策略供我们选择,分别是——always、everysec、no。

写回策略 同步频率 优点 缺点
always 每个指令同步写入 可靠性高,不易丢失数据 性能开销大
everysec 每秒同步一次 性能适中 宕机时会丢失1s内的数据
no 让操作系统来决定何时同步 性能高 宕机时丢失数据多,不可控

Redis默认采用的是everysec这种方案。三者同步的实现,就是在底层调用一个名叫fsync()函数的时间,always 同步执行,everysec 异步执行,no永不执行。

5. AOF文件重写

  AOF是一个文件,那么随着指令执行的越来越多,文件存储的东西也越来越多,文件就会变得很大。当文件过大时肯定会带来各种各样的问题,最主要的肯定是影响性能,我们Redis重启时,如果文件太大,读取的速度就会特别慢。
  所以Redis为我们提供了 AOF重写机制 。 当文件的大小超过某个阈值时,就会触发重写机制,或者手动调用bgrewriteaof命令触发,来压缩 AOF 文件。那么它重写的依据是什么呢?
  我们都知道Redis是一个key-value的键值型数据库,假设我们下面这些指令

set name zhangsan
set name lisi
set name wangwu

那么Redis只会存储最后一条指令:

set name wangwu

因为我们只需要关心Redis最终的效果,对于历史记录都会被覆盖,所以我们无需去记载。还有一些操作我们也可以进行合并起来,比如下面:

set num 123
set name jack
set num 666

可以合并为一条指令来执行,用最少的指令达到相同的效果

mset name jack num 666

还有一点需要注意的是,在重写时我们会拷贝一份AOF文件来进行重写,这样如果重写过程中失败了,也不会对原AOF文件造成污染,重写成功后直接覆盖原AOF文件即可。

6. 后台重写

  当触发重写时,AOF文件已经较大了,对所有数据重写这一个操作是非常非常耗时的,如果直接在主进程中进行,那么就会导致此时Redis无法去执行新到来的命令,所以我们重写AOF的过程是由后台子进程来完成的。
  这样操作有两个好处:

    1. 子进行重写AOF,主进程可以继续执行指令,避免主线程阻塞。
    1. 子进程带有主进程的数据副本,使用子进程而非线程,可以避免在不需要加锁的情况下,保证数据的安全性

  有一个需要注意的问题就是,子进程在重写时,主线程仍然在接收新的指令,会对Redis数据库进行修改,从而可能会出现Redis和重写后的AOF文件数据不一致的情况。所以Redis还提供了一个AOF重写缓冲区,这个缓冲区会在主线程fork出子进程开始工作,此时主线程在接收到客户端的命令后,不仅在AOF缓冲区记录日志,也会在重写缓冲区记录。

【Redis从入门到进阶】第 8 讲:Redis 持久化之 —— AOF

  当子线程完成重写后,就会向主线程附送一个信号告诉它,这时主线程就会调用一个信号的处理函数,该函数会干两件事:

    1. AOF重写缓冲区的所有内容追加到AOF缓冲区中,使得两个AOF文件保存的数据库状态一致
    1. 新的AOF文件改名,覆盖原来的AOF文件

然后主线程就可以继续执行命令了,在整个 AOF 后台重写的过程中,只有发生写时复制和信号处理函数时会对主线程进行阻塞, 其余时候,主线程都不会阻塞。

【Redis从入门到进阶】第 8 讲:Redis 持久化之 —— AOF文章来源地址https://www.toymoban.com/news/detail-424616.html

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

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

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

相关文章

  • 【Redis】理论进阶篇------Redis的持久化

    【Redis】理论进阶篇------Redis的持久化

         前面学习了Redis的相关的十大数据类型以及用SpringBoot集成我们的Redis的工具代码的书写。从这篇文章开始,就会从Redis相关的一些理论(也是面试和工作的热点知识)如:Redis的持久化、Redis的订阅发布模型、Redis集群环境搭建、哨兵模式等等方面介绍Redis相关的进阶知识

    2024年02月21日
    浏览(9)
  • 【Java 进阶篇】Redis持久化之RDB:数据的安全守护者

    【Java 进阶篇】Redis持久化之RDB:数据的安全守护者

    Redis,作为一款高性能的键值存储系统,支持多种持久化方式,其中RDB(Redis DataBase)是其最常用的一种。RDB可以将当前时刻的数据快照保存到磁盘,以便在Redis重启时快速恢复数据。本文将深入探讨RDB的原理、配置和实际应用,帮助初学者更好地理解和使用Redis的持久化机制

    2024年02月05日
    浏览(12)
  • Redis从入门到精通(十三)Redis分布式缓存(一)RDB和AOF持久化、Redis主从集群的搭建与原理分析

    Redis从入门到精通(十三)Redis分布式缓存(一)RDB和AOF持久化、Redis主从集群的搭建与原理分析

    单机Redis存在四大问题: 1)数据丢失问题; 2)并发能力问题; 3)故障恢复问题; 4)存储能力问题。 而Redis分布式缓存,即基于Redis集群来解决单机Redis存在的问题: 1)数据丢失问题:实现Redis数据持久化; 2)并发能力问题:搭建主从集群,实现读写分离; 3)故障恢复问

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

    Redis两种持久化方案RDB持久化和AOF持久化

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

    2024年02月14日
    浏览(13)
  • redis持久化【RDB+AOF】持久化双雄

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

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

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

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

    2024年03月10日
    浏览(15)
  • 【Redis】Redis 持久化

    【Redis】Redis 持久化

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

    2024年02月05日
    浏览(14)
  • Redis系列--redis持久化

    Redis系列--redis持久化

    redis本身运行时数据保存在内存中,如果不进行持久化,那么在redis出现非正常原因宕机或者关闭redis的进程或者关闭计算机后数据肯定被会操作系统从内存中清掉。当然,redis本身默认采用了一种持久化方式,即RDB (Redis DataBase),可以在redis的目录中找到dump.rdb文件,这就是

    2024年02月05日
    浏览(9)
  • 【Redis】Redis持久化机制

    Redis是基于内存存储的数据库,如果遇到服务重启或者崩溃,内存中的数据将会被清空。所以为了确保数据安全性和可靠性,我们需要将内存中的数据持久化到磁盘上。 持久化不仅可以防止由于系统故障、重启或者其他原因导致的数据丢失。还可以用于备份、数据恢复和迁移

    2023年04月20日
    浏览(13)
  • 【Redis】Redis持久化方式

    【Redis】Redis持久化方式

    Redis 中有两种持久化方式,分别为 RDB 和 AOF 。 RDB 全称 Redis Database Backup file ,也叫做 Redis 数据快照。简单来说就是把 Redis 中的数据记录到磁盘中。当 Redis 实例故障重启后,从磁盘读取快照文件,恢复数据。 RDB有两种备份方式,一种是主动备份,一种是Redis 内部执行备份 主

    2024年02月02日
    浏览(12)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包