【Redis】Redis持久化策略

目录

  • 策略
  • RDB
    • bgsave执行流程
    • RDB效果演示
    • RDB优缺点
  • AOF
    • AOF缓冲区刷新策略
    • AOF的重写机制
      • AOF重写机制的触发机制
      • AOF重写流程
  • 混合持久化
  • 同时存在aof和rdb快照,以谁为主?
  • 信号

策略

  1. RDB => Redis DataBase 相当于定期的方式实现持久化
  2. AOF => Append Only File 相当于实时的方式实现持久化

RDB

RDB定期的把我们Redis内存中的所有数据,都写入硬盘中,生成一个“快照”
Redis给内存中当前存储的这些数据,赶紧拍个照片,生成一个文件,存储在硬盘中~~
后续Redis一旦重启了,就可以根据刚才的“快照”就能把内存中的数据给恢复回来~

“定期”具体来说,又有两种方式:
1.手动触发.
程序员通过redis客户端,执行特定的命令,来触发快照生成
save
bgsave
2.自动触发.
在Redis配置文件中,设置一下,让Redis每隔多长时间/每产生多少次修改就触发。

save:执行save的时候,redis就会全力以赴的进行“快照生成”操作,此时就会阻塞redis的其他客户端的命令~导致类似于keys*的效果
一般不建议使用save
bgsave:bg=>background 不会影响Redis服务器处理其他客户端的请求和命令
Redis咋做到的?是不是搞了个多线程啥的?
并非如此!!
并发编程的场景.此处redis使用的是“多进程”的方式,来完成的并发编程,来完成的bgsave的实现。

bgsave执行流程

在这里插入图片描述
1.判断当前是否存在其他正在工作的子进程。
比如现在已经有一个子进程正在执行bgsave,此时就直接把当前的bgsave返回~
2.如果没有其他的工作子进程,就通过fork这样的系统调用创建一个子进程来~

fork是linux系统提供的一个创建子进程的api(系统调用)
fork创建子进程,简单粗暴,直接把当前的进程(父进程)复制一份,作为子进程~
一旦复制完成了,父子进程就是两个独立的进程,就各自执行各自的了~~

3.子进程负责进行写文件,生成快照的过程.
父进程继续接收客户端的请求,继续正常提供服务.
4.子进程完成整体的持久化过程之后,就会通知父进程,干完了,父进程就会更新一些统计信息,子进程就可以结束销毁了。

RDB效果演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
rdb文件中的数据,不是你这边插入了数据,就会立即更新的!!
在这里插入图片描述
在这里插入图片描述
1.手动执行save&bgsave触发一次快照
在这里插入图片描述
由于我们的数据比较少,执行bgsave瞬间就完成了,立即查看应该就是有结果的.如果以后我们接触的数据多了,执行bgsave就可能需要消耗一定的时间,立即查看不一定就是生成完毕了~
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过上述操作,就可以看到,redis服务器在重新启动的时候,加载了rdb文件的内容,恢复了内存中之前的状态。
2.插入新的key,不手动执行bgsave

在这里插入图片描述
在这里插入图片描述
发现没有,重新启动redis服务器
在这里插入图片描述

在这里插入图片描述
发现就有了,redis生成快照操作,不仅仅是手动执行命令才触发,也可以自动触发!!
1)通过刚才配置文件中save执行M时间内,修改N次
2)通过shutdown命令(redis里的一个命令)关闭redis服务器,也会触发。
3)redis进行主从复制的时候,主节点也会自动生成rdb快照,然后把rdb快照文件内容传输给从节点

如果是通过正常流程重新启动redis服务器,此时redis服务器会在退出的时候,自动触发生成rdb操作,但是如果是异常重启(kill -9 或者 服务器掉电)此时redis服务器来不及生成rdb,内存尚未保存到快照中的数据,就会随着重启而丢失~

3.bgsave操作流程是创建子进程,子进程完成持久化操作.
持久化会把数据写入新的文件中,然后使用新的文件替换旧的文件.

在这里插入图片描述
liunx文件系统.
文件系统典型的组织方式(ext4)主要是把整个文件系统分成了三个大的部分
1.超级块(放的是一些管理信息)
2.inode区(存放inode节点,每个文件都会分配一个inode数据结构,包含了文件的各种元数据)
3.block区,存放文件的数据内容了。
4.通过配置自动生成rdb快照
执行FLUSHALL也会清空rdb文件
在这里插入图片描述
5.如果把rdb文件,故意改坏了,会咋样?
手动的把rdb文件内容改坏.
然后一定是通过kill进程的方式,重新启动redis服务器.
如果通过service redis-server restart重启,就会在redis服务器退出的时候,重新生成rdb快照。
就把咱门刚才改坏了的文件给替换了~~

在这里插入图片描述

RDB优缺点

  • RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照。非常适用于备份,全量复制等场景,比如每6小时执行bgsave备份,并把RDB文件复制到远程机器或者文件系统中用于灾备。
  • Redis加载RDB恢复数据远远快于AOF的方式。
  • 在这里插入图片描述

  • RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork创建子进程,属于重量级操作,频繁执行成本过高。
  • RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个RDB版本,兼容性可能有风险。
  • AOF

    类似于mysql的binlog,就会把用户的每个操作,都记录到文件中。

    当redis重新启动的时候,就会读取这个aof文件中的内容,用来恢复数据~

    开启aof的时候,rdb就不生效了~
    启动的时候不再读取rdb文件内容了~

    aof默认一般是关闭状态,修改配置文件,来开启aof功能~
    在这里插入图片描述
    AOF是一个文本文件.
    每次进行的操作,都会被记录到文本文件中~
    在这里插入图片描述

    通过一些特殊符号作为分隔符,来对命令的细节做出区分~

    AOF缓冲区刷新策略

    在这里插入图片描述
    实际上,是没有影响的!并没有直接影响到redis处理请求的速度~
    1.AOF机制 并非是直接让工作线程把数据写入硬盘,而是先写入一个内存中的缓冲区,积累一波之后,再统一写入硬盘
    2.硬盘上读写数据,顺序读写的速度是比较快的
    随机访问则速度是比较慢的。
    AOF是每次把新的操作写入到原有文件的末尾,属于顺序写入~

    如果把数据写入到缓冲区里,本质还是在内存冲呀~
    万一这个时候,突然进程挂了,或者主机掉点了,咋办?是不是缓冲区中的数据就丢了??
    是的!!缓冲区中没来得及写入硬盘的数据是会丢的~

    redis给出了一些选项,让程序员,根据实际情况来决定怎么取舍~缓冲区的刷新策略 ~
    刷新频率越高,性能影响就越大,同时数据的可靠性就越高.
    刷新频率越低,性能影响就越小,同时数据的可靠性就越低.

    AOF的重写机制

    AOF文件持续增长,体积越来越大~
    会影响到,redis下次启动的启动时间~
    redis启动的时候要读取aof文件的内容

    注意!!上述aof中的文件,有一些内容是冗余的!

    redis存在一个机制,能够针对aof文件进行整理操作。这个整理就能够剔除其中的冗余操作,并且合并一些操作,达到给aof文件瘦身这样的效果。 重写机制~

    AOF重写机制的触发机制

    1. 手动触发:调用bgrewriteaof命令
    2. 自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机

    AOF重写流程

    在这里插入图片描述
    创建子进程fork
    父进程仍然负责接收请求.
    子进程负责针对aof文件进行重写~

    注意!重写的时候,不关心aof文件中原来都有啥~
    只关心内存中最终的数据状态~

    子进程只需要把内存中给当前的数据,获取出来,以AOF的格式写入一个新的AOF文件中!!

    此处子进程写数据的过程,非常类似于RDB生成一个镜像快照~
    只不过RDB这里是按照二进制的方式生成的
    AOF重写,则是按照AOF这里要求的文本格式来生成的.

    子进程写新aof文件的同时,父进程仍然在不停的接收客户端新的请求。
    父进程还是会写把这些请求产生的AOF数据写入到缓冲区,再刷新到原有的AOF文件里~
    在这里插入图片描述
    子进程这边,把aof数据写完之后,会通过信号通知一下父进程,父进程再把aof_rewrite_buf缓冲区中的内容也写入到新AOF文件里~

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    混合持久化

    AOF本来是按照文本方式来写入文件的.
    但是文本的方式写文件,后续加载的成本是比较高的~
    redis就引入了“混合持久化”的方式,结合了rdb和aof的特点~
    按照aof的方式,每一个请求/操作,都记录入文件。在触发aof重写之后,就会把当前内存的状态按照rdb的二进制格式写入到新的aof文件中。
    后续再进行的操作,仍然是按照aof文本的方式追加到文件后面。在这里插入图片描述
    这个选项为yes就是开启混合持久化。

    同时存在aof和rdb快照,以谁为主?

    在这里插入图片描述
    以aof为主!

    信号

    信号这个东西,可以认为是Linux的神经系统~
    进程之间的互相作用
    但是Java生态并不鼓励使用多进程模型编程~

    信号能表达的信息有限,并非像socket这样的方式可以传输任意的数据~
    因此,像上述父子进程场景中,子进程表达“我干完了”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/107953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用PHP爬取视频代码示例详细教程

以下是一个使用Symfony Panther和PHP进行爬虫的示例程序&#xff0c;用于爬虫企鹅上的视频。请注意&#xff0c;这个示例需要使用https://www.duoip.cn/get_proxy这段代码获取爬虫IP。 <?php // 引入所需的库 require vendor/autoload.php;use Symfony\Component\Panther\P…

人工智能应该怎么学?

人工智能这个词炙手可热&#xff0c;为了跟上时代的步伐&#xff0c;有许多小伙伴就想学习人工智能&#xff0c;今天来介绍一下人工智能究竟是什么&#xff1f;应该怎么学&#xff1f;怎么入门&#xff1f; 首先来看一下什么是人工智能&#xff1f; 人工智能 人工智能 人工智能…

Unity——数据存储的几种方式

一、PlayerPrefs PlayerPrefs适合用于存储简单的键值对数据 存储的数据会在游戏关闭后依然保持&#xff0c;并且可以在不同场景之间共享&#xff0c;适合用于需要在游戏不同场景之间传递和保持的数据。 它利用key-value的方式将数据保存到本地&#xff0c;跟字典类似。然后通…

ADAS可视化系统,让自动驾驶更简单 -- 入门篇

随着车载芯片的升级、技术的更新迭代&#xff0c;可视化ADAS逐渐变成汽车的标配走入大家的生活中&#xff0c;为大家的驾车出行带来切实的便捷。那么你了解HMI端ADAS的实现过程吗&#xff1f;作为ADAS可视化系统的入门篇&#xff0c;就跟大家聊一聊目前较常见的低消耗的一种ADA…

typora主题切换与推荐主题

在这篇博文中&#xff0c;我将向你展示如何给typora更换主题&#xff0c;并推荐几款出色的主题。通过这些主题的使用&#xff0c;你可以为你的typora编辑器增添一抹别样的风采&#xff0c;让你的写作体验更加美好、舒适。 typora替换主题的步骤非常简单&#xff0c;只需按照以…

C语言 形参、实参

定义 形参 形式上的参数&#xff0c;没有确定的值 实参 实际存在的&#xff0c;已经确定的参数&#xff0c;常量&#xff0c;变量&#xff0c;表达式&#xff0c;都是实参 区别 实参的值不随形参的变化而变化 在C语言中&#xff0c;数据传送是单向的&#xff0c;即只能把实…

【日常业务开发】接口性能优化

【日常业务开发】接口性能优化 缓存本地缓存分布式缓存 数据库分库分表SQL 优化 业务程序并行化异步化池化技术预先计算事务粒度批量读写锁的粒度尽快return上下文传递空间换时间集合空间大小 缓存 本地缓存 本地缓存&#xff0c;最大的优点是应用和cache同一个进程内部&…

怎么使用动态代理IP提升网络安全,动态代理IP有哪些好处呢

随着互联网的普及和数字化时代的到来&#xff0c;网络安全问题越来越受到人们的关注。动态代理IP作为网络安全中的一种技术手段&#xff0c;被越来越多的人所采用。本文将介绍动态代理IP的概念、优势以及如何应用它来提升网络安全。 一、动态代理IP的概念 动态代理IP是指使用代…

docker的资源限制参数设置错误,导致的clickhouse性能瓶颈

文章目录 使用场景问题现象解决处理 使用场景 我们使用docker作为服务的虚拟化工具&#xff0c;服务都部署在docker里我们使用docker-compose管理所有docker服务的配置文件针对某些服务&#xff0c;我们要限制这个docker服务容器占用的资源数量&#xff0c;例如cpu和内存在进行…

IPv6知识概述 - ND协议

IPv6知识概述 - ND协议 参考文章&#xff1a;https://blog.csdn.net/Gina_wj/article/details/106708770 IPv6基础篇&#xff08;四&#xff09;&#xff1a;邻居发现协议NDP ND协议功能概述 ND&#xff08;Neighbor Discovery&#xff0c;邻居发现&#xff09;协议是IPv6的…

flutter开发实战-下拉刷新与上拉加载更多实现

flutter开发实战-下拉刷新与上拉加载更多实现 在开发中经常遇到列表需要下拉刷新与上拉加载更多&#xff0c;这里使用EasyRefresh&#xff0c;版本是3.3.21 一、什么是EasyRefresh EasyRefresh可以在Flutter应用程序上轻松实现下拉刷新和上拉加载。它几乎支持所有Flutter Sc…

ICMP协议(二)

一 ping工作原理 ① 为什么ping不通 "ping不通分为两类" 1) 请求没有到目标服务器细节&#xff1a; 要注意是ip不通还是域名不能解析导致ping不通2) 请求到了目标服务器,但是没有回包 "常见原因" 1、对方关机/ip不存在备注&#xff1a; ping同网段不…

记一次MySQL5初始化被kill的问题排查 | 京东云技术团队

写在前面 由于测试环境JED申请比较繁琐&#xff0c;所以Eone提供了单机版Mysql供用户使用&#xff0c;近期Eone搭建Mysql5的时候发现莫名被kill了&#xff0c;容器规格是4C8G&#xff0c;磁盘30G 这不科学&#xff0c;之前都是可以的&#xff0c;镜像没变&#xff0c;配置没变…

k8s-16 k8s调度

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器&#xff0c;并且是集群控制面的一部分如果你真的希望或者有这方面…

企业立案信息API的优势与应用场景

引言 随着科技的不断进步&#xff0c;创业者和企业家们在创办新企业时愈发依赖数字化工具。其中&#xff0c;企业立案信息API成为了一项重要的资源&#xff0c;它提供了有关企业立案的关键信息&#xff0c;为企业家们提供了许多优势和丰富的应用场景。本文将探讨企业立案信息A…

MybatisPlus多表关联分页返回结果异常

1. 按照该博客进行多表关联分页查询&#xff1a; https://blog.csdn.net/code_ang/article/details/116448694 2.在实际测试过程中&#xff0c;发现异常&#xff0c;分页返回的结果时而正确&#xff0c;时而错误。 count函数满足预期 count函数不满足预期 只是count了主表的…

竞赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

C++之基于Winsock2封装UDPServer与UDPClient

文章目录 Socket过程UDPServer.hUDPServer.cppUDPClient.hUDPClient.cppmain.cppCMakeLists.txt测试截图 Socket过程 UDPServer UDPClient UDPServer.h #ifndef UDPSERVER_H_INCLUDED #define UDPSERVER_H_INCLUDED#include <iostream> #include <string> #inclu…

SAP-FI模块 处理自动生成会计凭证增强

2、固定资产业务过渡科目摘要增强功能-MIGO ENHANCEMENT 2 ZEHENC_SAPMF05A. "active version * FI 20221215&#xff1a;固定资产业务过渡科目摘要增强功能 WAIT UP TO 1 SECONDS.READ TABLE xbseg WITH KEY hkont 1601990001. IF sy-subrc 0.DATA: lt_bkdf TYPE …

flink教程

文章目录 来自于尚硅谷教程1. Flink概述1.1 特点1.2 与SparkStreaming对比 2. Flink部署2.1 集群角色2.2 部署模式2.3 Standalone运行模式2.3.1 本地会话模式部署2.3.2 应用模式 2.4 YARN运行模式2.4.1 会话模式部署2.4.2 应用模式部署 2.5 历史服务 3. 系统架构3.1 并行度3.2 …