Redis持久化的两种方式RDB和AOF(redis持久化rdb和aof区别)
mhr18 2024-11-11 12:05 16 浏览 0 评论
Redis提供了RDB和AOF两种持久化方式
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%时开始重写(文件是原来重写后文件的两倍时触发)。
重写流程
- bgrewriteaof触发重写,判断是否当前有bgsave 或bgrewriteaof在运行,如果有,则等待该命令结束后再继续执行
- 主进程fork出子进程执行重写操作,保证主进程不会阻塞
- 子进程变量redis内存中数据到临时文件,客户端的写请求同时写入aof_buf和aof_write_buf,保证原AOF以及新AOF文件生成期间的新的数据修改动作不会丢失
- 子进程写入完成后,向主进程发信号,父进程更新统计信息。同时,主进程把aof_write_buf中的数据写入到新的AOF文件。
- 使用新的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 这条规则
相关推荐
- Spring Boot3 连接 Redis 竟有这么多实用方式
-
各位互联网大厂的后端开发精英们,在日常开发中,想必大家都面临过系统性能优化的挑战。当系统数据量逐渐增大、并发请求不断增多时,如何提升系统的响应速度和稳定性,成为了我们必须攻克的难题。而Redis,这...
- 隧道 ssh -L 命令总结 和 windows端口转发配置
-
摘要:隧道ssh-L命令总结和windows端口转发配置关键词:隧道、ssh-L、端口转发、网络映射整体说明最近在项目中,因为内网的安全密级比较高,只能有一台机器连接内网数据库,推送...
- 火爆BOOS直聘的13个大厂Java社招面经(5年经验)助你狂拿offer
-
火爆BOOS直聘的13个大厂Java社招面经(5年经验)助你狂拿offer综上所述,面试遇到的所有问题,整理成了一份文档,希望大家能够喜欢!!Java面试题分享(Java中高级核心知识全面解析)一、J...
- 「第五期」游服务器一二三面 秋招 米哈游
-
一面下午2点,35分钟golang内存模型golang并发模型golanggc原理过程channel用途,原理redis数据结构,底层实现跳跃表查询插入复杂度进程,线程,协程kill原理除了kil...
- RMQ——支持合并和优先级的消息队列
-
业务背景在一个项目中需要实现一个功能,商品价格发生变化时将商品价格打印在商品主图上面,那么需要在价格发生变动的时候触发合成一张带价格的图片,每一次触发合图时计算价格都是获取当前最新的价格。上游价格变化...
- Redis 中的 zset 为什么要用跳跃表,而不是B+ Tree 呢?
-
Redis中的有序集合使用的是一种叫做跳跃表(SkipList)的数据结构来实现,而不是使用B+Tree。本文将介绍为什么Redis中使用跳跃表来实现有序集合,而不是B+Tree,并且探讨跳跃表...
- 一文让你彻底搞懂 WebSocket 的原理
-
作者:木木匠转发链接:https://juejin.im/post/5c693a4f51882561fb1db0ff一、概述上一篇文章《图文深入http三次握手核心问题【思维导图】》我们分析了简单的一...
- Redis与Java整合的最佳实践
-
Redis与Java整合的最佳实践在这个数字化时代,数据处理速度决定了企业的竞争力。Redis作为一款高性能的内存数据库,以其卓越的速度和丰富的数据结构,成为Java开发者的重要伙伴。本文将带你深入了...
- Docker与Redis:轻松部署和管理你的Redis实例
-
在高速发展的云计算时代,应用程序的部署和管理变得越来越复杂。面对各种操作系统、依赖库和环境差异,开发者常常陷入“在我机器上能跑”的泥潭。然而,容器化技术的兴起,尤其是Docker的普及,彻底改变了这一...
- Java开发中的缓存策略:让程序飞得更快
-
Java开发中的缓存策略:让程序飞得更快缓存是什么?首先,让我们来聊聊什么是缓存。简单来说,缓存是一种存储机制,它将数据保存在更快速的存储介质中,以便后续使用时能够更快地访问。比如,当你打开一个网页时...
- 国庆临近,字节后端开发3+4面,终于拿到秋招第一个offer
-
字节跳动,先面了data部门,3面技术面之后hr说需要实习转正,拒绝,之后另一个部门捞起,四面技术面,已oc分享面经,希望对大家有所帮助,秋招顺利在文末分享了我为金九银十准备的备战资源库,包含了源码笔...
- “快”就一个字!Redis凭什么能让你的APP快到飞起?
-
咱们今天就来聊一个字——“快”!在这个信息爆炸、耐心越来越稀缺的时代,谁不希望自己手机里的APP点一下“嗖”就打开,刷一下“唰”就更新?谁要是敢让咱用户盯着个小圈圈干等,那简直就是在“劝退”!而说到让...
- 双十一秒杀,为何总能抢到?Redis功不可没!
-
一年一度的双十一“剁手节”,那场面,简直比春运抢票还刺激!零点的钟声一敲响,亿万个手指头在屏幕上疯狂戳戳戳,眼睛瞪得像铜铃,就为了抢到那个心心念念的半价商品、限量版宝贝。你有没有发现一个奇怪的现象?明...
- 后端开发必看!为什么说Redis是天然的幂等性?
-
你在做后端开发的时候,有没有遇到过这样的困扰:高并发场景下,同一个操作重复执行多次,导致数据混乱、业务逻辑出错?别担心,很多同行都踩过这个坑。某电商平台就曾因订单创建接口在高并发时不具备幂等性,用户多...
- 开发一个app需要哪些技术和工具
-
APP开发需要一系列技术和工具的支持,以下是对这些技术的清晰归纳和分点表示:一、前端开发技术HTML用于构建页面结构。CSS用于样式设计和布局。JavaScript用于页面交互和逻辑处理。React...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)