百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Redis持久化的两种方式RDB和AOF(redis持久化rdb和aof区别)

mhr18 2024-11-11 12:05 24 浏览 0 评论

Redis提供了RDBAOF两种持久化方式

RDB

RDB(Redis Database),在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存里

备份执行流程

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

RDB的缺点是最后一次持久化后的数据可能丢失

Fork

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

持久化流程



RDB文件

redis.conf中配置文件名字,默认为dump.rdb

# 配置备份文件名称
dbfilename dump.rdb
# 备份目录,即应用启动的目录
dir ./
  • stop-writes-on-bgsave-error:当Redis无法写入磁盘时,进行的操作。默认yes,直接关闭Redis的写操作。
  • rdbcompression:是否启用压缩,默认yes,Redis采用LZF算法进行压缩
  • 假如不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但推荐启用。
  • rdbchecksum:是否检查完整性,默认yes
  • 在存储快照后,还可以让Redis还有CRC64算法进行数据校验,但是这样会增加大约10%的性能消耗。如果希望获取到最大的性能提升,可以关闭此功能。
  • 但是推荐启用。
  • save:写操作次数
  • RDB是整个内存的压缩过的Snapshot,RDB的数据结构,可以配置复合的快照触发条件。
  • 默认,1分钟内修改了1万次,或5分钟内修改了10次,或15分钟内修改了1次。
  • save只管保存,会阻塞其它命令,手动操作,不建议使用
  • 建议:不设置save指令,或者给save传入空字符串
  • bgsave
  • Redis会在后台异步进行快照操作,同时也可以响应其它操作,
  • 可以同lastsave命令获取最后一次成功执行快照的时间

优势

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

缺点

  • Fork时,内存中的数据被克隆了一份,大致膨胀2倍,需要考虑性能
  • 虽然使用了写时拷贝技术,但是如果数据庞大时,还是比较消耗性能
  • 一定时间间隔做一次备份,如果Reids意外宕机等情况下,会丢失最后一次快照后的所有修改

总结



  • RDB是一个非常紧凑的文件
  • 在保存RDB文件时,父进程需要fork一个子进程,由子进程完成任务,父进程不需要做其它IO操作。所以RDB持久化方式可以最大化Redis性能。但当数据集较大时,比较耗时,会影响其它操作。
  • 与AOF相比,在恢复大的数据集时,RDB方式会更快一些
  • RDB数据丢失风险很大

AOF

AOF(Append Of File),是以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有指令记录下来,只需要追加文件但不可以改写文件。

Redis启动时会读取该文件重新构建数据。换言之,Redis启动时会依次执行该文件中所有的指令,以完成数据的恢复工作。

流程

  • 客户端的请求写命令会被追加到AOF缓冲区内
  • AOF缓冲区,根据持久化策略将操作同步到磁盘AOF文件中
  • AOF文件大小超过重写策略或手动重写时,会对AOF文件重写,压缩AOF文件
  • Redis服务重启时,会重新加载aof文件,并执行写操作,以达到数据恢复的目的

AOF默认是不开启的,可以在redis.conf中配置文件名称,默认为appendonly.aof.

# 是否启用AOF
appendonly yes
# AOF文件名
appendfilename "appendonly.aof"

AOF文件保存路径与RDB文件路径保持一致。

AOF和RDB可以同时使用吗?

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

AOF启动、修复、恢复

  • AOF的备份机制和性能虽然和RDB不同,但是备份和回复的操作同RDB一样,都是拷贝备份文件,需要恢复时,再拷贝到Redis工作目录下,启动系统即加载
  • 正常恢复
    • 启用AOFredis.conf
    • appendonly yes
    • 将aof文件复制到备份目录下
    • # 查看目录
      config get dir
    • 重启Redis,会自动加载aof文件
  • 异常恢复
    • 启用aofredis.conf
    • appendonly yes
    • 备份受损aof文件
    • 恢复受损的aof文件
    • // 修复命令
      redis-check-aof --fix appendonly.aof
    • 重启redis

AOF同步频率设置

appendfsync [always|everysec|no]
  • always:始终同步,每次Redis的写入都会立刻记入日志
  • 虽然性能较差,但数据完整性还是比较好
  • everysec:每秒记入日志一次,如果宕机,最后一秒的数据可能丢失
  • no:Redis不主动进行同步,把同步时机交给操作系统

Rewrite压缩

AOF采用文件追加方式,随着时间变化,文件会越来越大。为了避免出现这种情况,新增了重写机制,只保留可以恢复数据的最小指令集。

AOF文件过大时,会fork一条新进程来将文件重写(先写入临时文件,在重命名)。

Redis 4.0+版本后的重写是指把RDB快照,以二进制的形式附在新的AOF文件头部,作为已有的历史数据,替换掉原来的流水账操作。

何时重写?

Redis会记录上次重写时的AOF大小,默认配置是当前AOF文件大小是上次重写后大小的一倍,且文件大于64MB时触发。

重写虽然可以节约大量磁盘空间,减少恢复时间。但是每次重写还是由一定的负担的,因此设定Redis要满足一定条件才会进行重写。

auto-aof-rewrite-percentage:设置重写的基准值,文件达到100%时开始重写(文件是原来重写后文件的两倍时触发)。

重写流程

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

优势

命令请求网络协议格式的命令内容客户端服务器AOF文件
  • 备份机制更稳健,丢失数据概率较低
  • 可读的日志文件,通过操作AOF文件,可以处理误操作

劣势

  • 占用更多的磁盘空间
  • 恢复备份速度慢,需要依次执行写操作命令
  • 每次读写都同步的话,有一定的性能压力

RDB vs AOF

官方推荐两个都启用。

如果对数据不敏感,可以单独用RDB。但不建议单独使用AOF,可能会出现Bug。

如果只是做纯内存缓存,可以都不用。

总结

  • RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储
  • AOF持久化方式记录每次的写操作。当服务器重启时,会重新执行这些命令来恢复原始的数据。AOF命令以Redis协议追加保存每次写的操作到文件末尾
  • Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于太大
  • 如果你只希望你的数据在服务器运行时存在,你可以不使用任何持久化方式
  • 建议同时开启两种持久化方式
  • 当Redis重启时,会优先加载AOF文件,因为AOF文件相对于RDB文件保存的数据要完整
  • 性能建议
    • 因为RDB文件只用作第二方案,建议只在Slave上使用RDB持久化,而且只要15分钟备份一次就够了,只保留save 900 1 这条规则

相关推荐

软考架构师-案例分析之Redis(软考架构师真题)

软考架构师考试中,Redis的知识考了很多回,从最近几年来看,案例分析经常考,有的时候单独考,有的时候和其他知识点一起考。Redis过往的考试中,考过的知识如下:1、Redis特点,涉及数据类型、持久...

揭秘:视频播放网站如何精准记录用户观看进度

在互联网蓬勃发展的当下,视频内容已毫无争议地成为人们获取信息、享受娱乐休闲时光的核心方式。据权威数据统计,全球每天有数十亿小时的视频被观看,视频流量在网络总流量中的占比逐年攀升,预计在未来几年内将超过...

量子级一致性!Flink+Redis全局状态管理

百万级实时计算任务如何实现亚毫秒级状态访问?本文揭秘Flink+Redis的量子纠缠态状态管理方案,将状态延迟降至0.3ms。引子:实时风控系统的量子跃迁//传统Flink状态管理(基于RocksD...

在 Mac 上运行 Redis 的 Docker 容器

在Mac上运行Redis的Docker容器,你可以按以下步骤操作,非常简单高效:一、前提要求已安装DockerDesktopforMac可通过终端验证Docker是否可用:d...

从 0 到 1:使用 Nginx + Lua 打造高性能 Web 网关

在大规模分布式架构中,Web网关扮演着重要角色,负责请求转发、负载均衡、限流、认证等功能。而Nginx+Lua结合可以提供:o高性能:Nginx是目前最流行的高性能Web服务器o动...

外贸独立站缓存设置黑科技:用错Redis比没缓存更致命

上周帮一个杭州卖家排查网站崩溃问题,发现这老铁把Redis缓存设置成128MB还开着持久化,服务器内存直接炸得比春节红包还彻底——"你这哪是缓存啊,根本是DDoS攻击自己!"最近Clo...

Spring Boot3 整合 Redis,这些缓存注解你真的会用吗?

你在开发SpringBoot3项目时,有没有遇到过这样的困扰?随着项目功能不断增加,数据量逐渐庞大,接口响应速度变得越来越慢,用户体验直线下降。好不容易找到优化方向——引入Redis缓存...

MySQL处理并发访问和高负载的关键技术和策略

MySQL处理并发访问和高负载的关键技术和策略主要包括以下几个方面:一、硬件优化1.CPU:提升CPU处理能力可以明显改善并发处理性能。根据数据库负载,考虑使用更多的CPU核心。2.内存:增加内存可以...

druid解决高并发的数据库(druid多数据源配置 spring boot)

处理高并发的时候可以解决我们java一个核心问题java核心问题就是并发问题解决并发一个是redis一个是线程池的方式现在出来是个druid好像现在解决高并发的方式进行更换数据库的方式操作场景插入频繁...

高并发方案最全详解(8大常见方案)

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen睿哥。高并发是大型架构的核心,下面我重点来详解常见8大高并发方案@mikechen文章来源:mikechen.cc分...

MySQL如何处理并发访问和高负载?(mysql如何处理并发访问和高负载访问)

MySQL在处理并发访问和高负载方面,采取了一系列关键技术和策略,以确保数据库系统在面对不断增长的并发需求时维持高效和稳定的性能。以下是对这些技术和策略的详细阐述,旨在全面解析MySQL如何处理并发访...

Redis高可用集群详解(redis高可用方案以及优缺点)

Redis集群与哨兵架构对比Redis哨兵架构在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具监控master节点状态,如果master节点异常,则会做主从切换,将某一台sla...

MCP协议重大升级!Spring AI联合阿里Higress,性能提升300%

引言:一场颠覆AI通信的技术革命2025年3月,MCP(ModelContextProtocol)协议迎来里程碑式升级——StreamableHTTP正式取代HTTP+SSE成为默认传输层。这一...

阿里三面被挂,幸获内推,历经5轮终于拿到口碑offer

作者:Java程序猿阿谷来源:https://www.jianshu.com/p/1c8271f03aa5每一个互联网人心中都有一个大厂梦,百度、阿里巴巴、腾讯是很多互联网人梦寐以求的地方,而我也不例...

来瞧瞧阿里一面都面些什么(笔试+机试)

絮叨说实话,能有机会面一下阿里对我来说帮助确实有蛮多,至少让我知道了自己的不足在哪,都说面试造火箭,上班拧螺丝。但就算是如此,为了生存,你也只有不停的学习,唯有光头,才能更强。哈哈起因2月28日在Bo...

取消回复欢迎 发表评论: