探索Redis持久化原理


探索Redis持久化原理

深入探索Redis持久化原理

redis是一个内存数据库,为了保证数据的持久化,redis提供了两种持久化方式rdb和aof,

redis是一个内存数据库,为了保证数据的持久化,redis提供了两种持久化方式rdb和aof,下面我们就分别来看下这两种持久化方式的实现原理。

RDB(默认)

RDB是通过快照方式完成的,当满足一定条件时,redis会自动将内存中的数据持久化到磁盘。

触发快照的时机

  • 符合自定义配置的快照规则。(在redis.conf中配置,下面会详细介绍)
  • 执行s*e或者bgs*e命令
  • 执行flushall命令
  • 执行主从复制操作(第一次)

(免费学习视频教程推荐:mysql视频教程)

原理图

深入探索Redis持久化原理

  • 在快照进行的过程中,也就是生成文件的过程中,不会对原有的rdb文件进行修改,直到快照生成完毕,直接将老的替换成新的,保证rdb文件任何时刻都是完整的。
  • 我们可以通过定时备份rdb文件来实现redis数据的备份,rdb是压缩的二进制文件,占用空间小,有利于传输

###快照设置规则 s*e {多少秒内} {数据变化了多少}

例如:s*e 100 1:在100秒内,至少有一个键被修改就进行快照;s*e 200 4:在200秒内,至少4个键被修改就进行快照。

RDB的优缺点

  • 缺点:使用RDB进行持久化,在redis突然异常退出的时候,会丢失最后一次快照之后的数据。但是,可以根据组合设置自动快照的方式,降低数据损失,确保在接受范围内。如果数据较为重要,可以使用AOF方式
  • 优点:使用RDB方式可以最大化redis性能,在快照过程中,我们可以看到主进程只需要fork出一个子进程即可,剩下的工作全部由子进程完成,父进程无需进行任何的磁盘I/O操作。但是,如果数据集较大,在fork子进程的时候比较耗时,会导致redis在一段时间内停止处理请求。

AOF方式

默认情况下,redis是没有开启AOF(append only file)的。在开始AOF之后,redis每接收到一条更改redis数据的命令,就会将该命令写入硬盘中的AOF文件。很明显,该过程会降低redis的性能,但大部分情况下是能够接受的,同时,使用性能较好的硬盘可以提高AOF性能

AOF配置方式

# 开启appendonly参数appendonly true# 设置AOF文件位置dir ./# 设置AOF文件名称,默认是appendonly.aofappendfilename appendonly.aof<br/>

原理图

深入探索Redis持久化原理

RESP协议

Redis客户端使用RESP协议与Redis服务端进行通信,该协议是专门为redis设计的,但是也可以用于其他C-S项目。

  • 间隔符号:在linux中是\r\n,在windows中是\n
  • 简单字符串以'+'开头
  • 错误Errors,以'-'开头
  • 整数类型Integer,以':'开头
  • 大字符串以'$'开头
  • 数组类型Arrays,以'*'开头

AOF原理说明

redis通过将所有的写入命令记录到AOF文件中,来持久化数据。而将命令记录到AOF文件的过程,可以分成三个阶段:

  • 命令传播
  • 缓存追加
  • 文件写入和保存

命令传播

redis将执行完的命令,命令参数,命令参数格个数等内容发送到AOF程序。当redis客户端执行命令的时候,通过连接,将协议文本发送到redis,redis接收到协议文本之后,根据内容,选择适当的命令函数,将协议文本转换成Redis字符串对象,在命令函数执行完成后,将命令参数发送到AOF程序。

Trae国内版 Trae国内版

国内首款AI原生IDE,专为中国开发者打造

Trae国内版 2045 查看详情 Trae国内版

缓存追加

AOF程序接收到命令参数之后,会将其从字符串对象转换成协议内容,再将协议内容追加到AOF缓存中。AOF缓存是在redisServer结构的aof_buf中,新的内容会被追加到aof_buf末尾。aof_buf保持着所有未被写入到AOF文件的协议文本。

文件写入和保存

将AOF缓存内容写入到AOF文件,并保持到磁盘。 当服务器的常规函数被执行,或者事件处理器被执行的时候,flushAppendOnlyFile函数将会被执行。会有以下两个过程。

  • WRITE:将AOF缓存中的内容写入到AOF文件
  • S*E:调用fsync或者fdatasync函数,将AOF文件保存到磁盘中

AOF一共有三种保存模式

  • AOF_FSYNC_NO:不保存。在这种模式下,每次调用flushAppendOnlyFile函数,write会被执行,而s*e会被忽略。而s*e只有在以下三种条件下会触发,redis关闭,aof功能关闭,系统的写缓存被刷新(可能是缓存满了,或者定期执行保持操作)。这三种情况下执行s*e操作会引起redis主线程的阻塞。
  • AOF_FSYNC_EVERYSEC(默认):每秒保存一次。s*e每秒被执行一次,但是s*e由后台子线程完成,不会导致redis主线程阻塞。
  • AOF_FSYNC_ALWAYS:每执行一个命令保存一次。这种情况下,每执行一个命令write和s*e都会被执行,而且s*e操作由主线程完成,会导致redis的阻塞。安全性较高,性能较差,因此不推荐使用。

AOF的文件优化

Redis可以在AOF文件过大的时候,在后台(子进程)对AOF文件进行重写。重写之后的新文件,包含恢复当前数据集所需的最小命令集合。重写,并不会对AOF文件进行读取和写入,针对的是数据库中的当前键。

优化前set s1 1set s1 2set s1 3优化后set s1 3<br/>

AOF文件优化原理

AOF的重写是通过子进程实现的,因此,主线程是继续工作的,有可能对新的数据进行修改,有可能会导致数据库的数据和重写之后的数据不一致。redis通过增加一个AOF重写缓存来解决这个问题,当fork出子进程之后,新的命令不仅会追加到现有的AOF文件中,还会添加一份数据到这个缓存当中。

深入探索Redis持久化原理

重写过程分析(需要保证从写的操作是绝对安全的)

Redis创建新的AOF文件之后,会继续将命令添加到原有的AOF文件中,即使数据库突然宕机了,原有的AOF文件和文件内容也不会有损失。而当新的AOF文件创建完毕之后,会直接把旧的替换掉,往新的AOF文件中添加命令。

当子进程在进行重写时,主进程会完成下列工作

  • 处理请求,将新的命令继续添加到AOF文件中,同时将命令添加到AOF重写缓存中。保证数据的一致行,避免出现数据丢失。
  • 当子进程重写完毕之后会向主进程发送一个完成信号,这时主进程会把重写缓存中的内容添加到新的AOF文件中,这样新的AOF文件,数据库,旧的AOF文件的内容就完全一致了。然后对新的AOF文件改名,覆盖原有的AOF文件。

这样程序就完成了新旧AOF文件的替换工作。而当处理完成之后,主进程就会继续接受请求。整个重写过程中只有最后的缓存写入和改名替换的操作会导致主进程阻塞,其他时候不会影响redis的正常工作,把AOF重写对redis的性能影响降到最低。

优化触发条件

#当前的AOF文件超过上次重写时AOF文件大小百分几的时候进行重写,如果没有重写过,则以启动时AOF文件的大小为准auto-aof-rewrite-percentage 100#限制允许重写的最小的AOF文件,也就是文件小于这个值的时候不需要进行重写优化auto-aof-rewrite-min-size 64mb<br/>
本文转载自:https://database.51cto.com/art/202502/610825.htm

更多redis知识请关注redis数据库教程栏目。 

以上就是探索Redis持久化原理的详细内容,更多请关注其它相关文章!


# 三种  # 闽清网站建设公司  # 一站式全域营销推广方案  # seo 什么是自然搜索  # 淘宝站外推广网站怎么样  # ocpx怎么查看关键词排名  # 虎丘网站建设解决方案  # 上海浦东seo网站优化怎么代理  # 酒店网站图片优化  # 自贡个性化网站建设平台  # 瀑布流式电商 seo  # 发送到  # Redis  # 会对  # 两种  # 就会  # 情况下  # 是一个  # 国内  # 过程中  # 重写  # AOF  # RDB 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 我的世界游戏平台入口 我的世界官方官网直达链接  C++ bind函数使用教程_C++参数绑定与函数适配器的应用  雨课堂官网在线登录 网页版雨课堂登录链接  京东快递包裹信息查询入口 京东快递官方查询平台入口  风车动漫官网首页入口登录 风车动漫在线观看正版地址  德邦快递收费标准详解  VS Code源代码管理(SCM)视图的进阶使用技巧  XPath动态元素定位:如何精准选择文本内容变化的元素  抖音网页版官方链接 抖音网页版官网链接入口  cad怎么隐藏指定的图层_cad隐藏或冻结图层方法  126手机126邮箱登录_126邮箱手机登录入口官网  冬季去哪个城市旅游更有可能观测到极光  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  《华夏千秋》龙女试炼功法获取方法  B站怎么开|直播| B站|直播|申请需要什么条件【新手必看】  鸿蒙单条备忘录如何加密  使用AI在VS Code中将代码从一种语言翻译成另一种  《洛克王国:世界》国家队搭配攻略  Windows Audio服务启动失败怎么办_电脑没声音的终极服务修复法【修复】  QQ邮箱注册地址 免费获取QQ邮箱账号  漫蛙官网(首页入口)_漫蛙漫画稳定访问教程分享  如何在CSS中使用伪类选择器_hover实现悬停效果  优化Google Charts Gauge:在数据库无数据时显示默认值  c++如何使用std::thread::join和detach_c++线程生命周期管理  发博客与长微博技巧  Animex动漫社社登录官网 Animex动漫社资源社入口直达  外媒评《燕云十六声》DIY载具新玩法:很像《塞尔达传说王国之泪》!  《兴业银行》注册登录方法  《火花chat》搜索好友方法  wps文字怎么设置文字环绕图片的方式_wps文字如何设置文字环绕图片方式  C++怎么实现一个红黑树_C++高级数据结构与平衡二叉搜索树  解决Pandas DataFrame高度碎片化警告:高效创建多列的策略  《我的恋爱逃生攻略》中文名字输入方法  折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点  win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】  如何外贸网站设计-能留住客户提升用户体验!  如何在mysql中比较InnoDB和MyISAM区别  《红果免费短剧》下载观看方法  iCloud官方网站 iCloud网页版在线登录入口  yy漫画官方网站登录入口_yy漫画在线阅读页面地址  哔哩哔哩黑名单怎么查看  谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达  三星M34录音变声问题_Samsung M34麦克风调整  解决CSS布局中意外顶部空白问题的教程  sublime如何处理超大文件不卡顿 _sublime打开大日志文件技巧  消除网页顶部意外空白线:CSS布局常见问题与解决方案  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】  WooCommerce 新客户订单自动添加管理员备注教程  Win11便笺在哪打开 Win11桌面便笺(Sticky Notes)使用方法【详解】  163邮箱在线登录 163邮箱网页版在线入口 

 2020-02-22

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.