大数据必学:redis深入了解 Redis 的持久化机制(RDB、AOF)
mhr18 2024-11-11 12:05 15 浏览 0 评论
因为 redis是一个内存数据库,所有数据都存储在内存中,而且内存中的数据非常容易丢失,所以 redis的数据持久化就变得非常重要, redis提供了两种数据持久化方法,分别用于 RDB和 AOF,而 redis默认用于 RDB的数据持久化方法。
一、RDB持久性方案简介
RDB方案简介:
Redis将定期将数据快照保存到 rdb文件中,并在启动时自动装入 rdb文件,以恢复之前保存的数据。可将 Redis配置为在配置文件中保存快照。
save [seconds] [changes]
意思是[seconds]秒内如果发生了[changes]次数据修改,则进行一次RDB快照保存,例如:
save 60 100
每隔60秒 Redis就会检查一次数据更改,如果发生了100次或更多的数据更改,将保存 RDB快照。多个 save指令可以进行配置, Redis可以执行多层快照保存策略。默认打开 RDB快照。RDB快照保存还可以通过 SAVE或 BGSAVE命令手动触发。
在 SAVE和 BGSAVE命令中, rdbSave函数都被调用,但是它们以不同的方式调用:
1、在保存完成之前, SAVE直接调用 rdbSave来阻塞 Redis主进程。服务器无法在主进程阻塞期间处理客户机的任何请求。
2、而 BGSAVE则把子进程 fork出来,该进程负责调用 rdbSave,并在保存完成后向主进程发出通知,告知保存完成。在 BGSAVE执行过程中, Redis服务器仍可继续处理客户机请求。
RDB方案好处:
1、最低限度的性能影响。如前所述,当保存 RDB快照时, Redis将对 fork出子进程执行,这几乎不会影响 Redis处理客户机请求的效率。
2、每一张快照都会产生一个完整的数据快照文件,因此可以用其他方法来同时保存多个时间点的快照(例如将每天0点的快照备份到其他存储介质),作为非常可靠的灾难恢复方法。
3、与 AOF相比,使用 RDB文件的数据恢复更快
RDB模式缺陷:
1、快照是定期生成的,因此当使用 Redis crash时,数据的一部分或多或少会丢失。
2、当数据集非常大, CPU不够强时(例如单核 CPU), Redis可能会花费相对较长的 fork子进程时间,从而影响 Redis外部服务的提供。
RDB方案配置:
修改redis的配置文件:
重启 redis Service
每生成一个新的 dump. rdb,就覆盖以前的旧快照
二、AOF持久化方案简介
1、AOF方案简介:
AOF (append only file)持久化:将每个写入命令以独立日志的方式记录下来,重启后再重新执行 AOF文件中的命令,以实现数据恢复。AOF的主要功能是处理数据持久的实时性,目前, AOF已成为 Redis持久性的主流方式。了解掌握 AOF的持久性机制对于我们处理数据安全和性能方面非常有帮助。
2、运用AOF:
打开 AOF功能要求进行设置配置: appendonlyyes,默认不启用。通过 appendfilename配置设置 AOF文件名,默认的文件名是appendonly.ao f。通过 dir配置指定,保存路径与 RDB持久化方式一致。AOF工作流程操作 :命令写入(append),文件同步(sync),文件重写(rewrite),重新启动装载(load),如图所示。
执行流程:
1、所有的写入命令会追加到aof_buf(缓冲区)中。
2、根据相应的策略, AOF缓冲区对硬盘进行同步操作。
3、当 AOF文件变得更大时,需要定期重写 AOF文件,以实现压缩。
4、重启 Redis服务器后,可以加载用于数据恢复的 AOF文件。
3、文件同步:
Redis提供了多种 AOF缓冲同步文件策略,这些策略由 appendfsync参数控制,图中显示了不同值的含义。
3.1、当配置为 always时,每次写入都会同步 AOF文件,而在普通 SATA硬盘上, Redis只支持大约数百 TPS写入,这显然与 Redis的高性能特性背道而驰,因此不推荐使用。
3.2、配置为 no,因为操作系统对 AOF文件的每一次同步都是不可控制的周期,并且会增加每一次同步硬盘的数据量,虽然提高了性能,但是数据安全没有保障。
3.3、配置为 everysec,建议采用同步策略和默认策略,以兼顾性能和数据安全。
4、重写机制:
AOF会随着命令的执行而变大,为了解决这个问题, Redis引入了 AOF覆盖机制来压缩文件。AOF文件覆盖是将 Redis进程中的数据转换成写入命令,使其与新 AOF文件同步的过程。
为什么覆盖了 AOF的文件可以变小?原因如下:
1、已在进程中超时的数据不再写入文件。
2、以前的 AOF文件中包含诸如 delkey1, hdelkey2, srem keys,seta111, seta222等等无效命令。覆盖直接使用进程中的数据生成,因此新的 AOF文件只保存最终数据的写入命令。
3、可以将多个写命令合并成一个,例如: lpush list a,、lpush list b、lpush list c可转换为: lpush list a b c 。为避免单个命令太大导致客户端缓冲区溢出,对于 list, set, hash, zset之类的类型操作,将多个元素分割成64个界限。
AOF重写减少了文件占用空间,除此之外,还有另外一个目的: Redis可以更快地加载更小的 AOF文件。
可手动或自动触发 AOF重写过程:
手动触发:直接调用命令 bgrewriteaof。
自动触发:Auto-aof-rewrite-min-size和Auto-aof-rewrite-percentage参数决定了自动触发的时间点。
解释:
1、auto-aof-rewrite-min-size:表示在运行 AOF覆盖时,文件的最小体积,默认值为64 MB。
2、auto-aof-rewrite-percentage:表示 AOF文件空间(aof_current_size)与上次重写后的 AOF文件空间之间的比值。
3、自动触发时机=aof_current_size>auto-aof-rewrite-min-size&&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewrite-percentage
AOF场景配置:
1、在 redis中, aof的持久化机制默认关闭
2、AOF持久化默认为关闭的 ,RDB持久化默认为打开
3、appendonly yes,能够打开 AOF持久机制,在生产环境中,通常 AOF都会被打开,除非你不介意数据被随意丢失几分钟
4、在打开 AOF持久化机制后, redis每次收到写命令时,都会将其写入日志文件,当然是先写入 os cache,然后每隔一段时间再进行 fsync
5、当 AOF和 RDB都打开并且 redis重新启动时,优先使用 AOF恢复数据,因为 aof数据比较完整
AOF的 fsync策略可以进行配置,有三种策略可供选择:
1、一种是每次写入数据时都执行一次 fsync。
2、另一种是每隔一秒执行一次 fsync。
3、另一种是不主动执行 fsync。
always:每写一次,就把相应于该数据的写日志 fsync放到磁盘上,性能非常糟糕,吞吐量也很低;要确保说 redis中的一个数据不会丢失,只能这样。
redis中的默认 AOF持久性机制全部关闭
Redis的AOF持久化机制配置:
重新启动 redis实例,并在执行简单操作后关闭该实例,重新启动 redis实例。
三、重启加载流程:
如果觉得对你有所帮助。记得收藏和关注呦!(每日更新各种大数据框架)
如需转载请注明出处(创作不易请见谅)
和巨婴程序猿一起成长。让自己变得更优秀
想了解更多精彩内容,快来关注跟着巨婴去逆袭
我最近一直在思考(大数据通俗讲解)的问题,你的看法是什么呢?关注我快说出来一起交流一下吧~
相关推荐
- 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)