12.redis 持久化

redis 持久化

  • redis 持久化
    • redis持久化策略
      • RDB => Redis DataBase 定期备份
        • rdb 文件处理
        • rdb 优缺点
      • AOF => Append Only File 实时备份
      • AOF 工作流程
      • AOF 缓冲区刷新策略
      • AOF 重写机制
        • AOF 重写流程
    • 混合持久化
    • 持久化流程
    • 总结

redis 持久化

redis 是一个内存数据库,把数据存储在内存中的,内存中的数据是不持久的,要想做到持久,就需要让redis把数据存储到硬盘上。
为了保证速度块,数据肯定还是得在内存中,但是为了持久化,数据还得想办法存储在硬盘上。

redis持久化策略

RDB => Redis DataBase 定期备份

RDB 定期的把 Redis 内存中的所有数据,都给写入到硬盘中,生成一个 “快照”。
“定期”具体来说又分为两种方式:

  1. 手动触发
    即通过redis客户端,执行特定的命令(save / bgsave),来触发快照生成。

    • save
      执行 save 命令的时候,redis 就会全力以赴的进行 “快照生成” 操作,此时就会阻塞 redis 其他客户端的命令~~ (进而导致类似于 keys *的后果)

      save 命令就是直接再当前进程中,直接往 /var/lib/redis/dump.rdb 文件中写入,没有文件替换操作。

    • bgsave bg => background(后面)
      bgsave 不会影响 redis 服务器处理其他客户端的请求和命令。
      其中bgsave的执行流程图如下:
      在这里插入图片描述
      1.父进程先判断当前是否已经存在其他正在工作的子进程。
      即比如现在已经有一个子进程正在执行 bgsave,此时就直接把当前的 bgsave 返回~~
      2.如果没有其他工作的子进程,就通过 fork 这样的系统调用去创建一个子进程
      3.默认情况下父进程会阻塞等待子进程退出。
      即父进程设置了"nohup"参数为"no"。这就意味着父进程将会阻塞等待子进程完成持久化操作,并且在此期间无法处理新的命令请求。
      如果父进程设置了"nohup"参数为"yes",它将不会等待子进程退出。此时子进程负责进行写文件,生成快照。父进程继续接收客户端的请求,继续正常提供服务。
      4.子进程完成整体的持久化过程之后,就会通知父进程,父进程就会更新一些统计信息,进而子进程就可以结束销毁了。
      其中 redis 生成的快照 rdb 文件,是存放在 redis 的工作目录中的。该路径也是在redis 配置文件中进行设置的。配置文件通常在 /etc/redis/redis.conf
      在这里插入图片描述
      rdb 机制生成的镜像文件,redis 服务器默认就是开启了 rdb 的
      在这里插入图片描述
      其中 rbd 是 一个二进制文件,即把内存中的数据以压缩的形式,保存到这个二进制文件中。
      当子进程生成 rdb 镜像操作的时候,此时就会把要生成的快照数据,先保存到一个临时文件中,当这个快照生成完毕之后,再删除之前的的 rdb 文件,把新生成的临时的 rdb 文件名字改成刚才的 dump.rdb,至始至终,rdb文件只有一个。

  2. 自动触发
    在redis配置文件中,设置一下,让redis 每隔多长时间/每产生多少次修改就触发。
    默认配置是下面的三种的档位:

    1. 时间过了900秒,且期间至少有1 次key的变化时
    2. 时间过了300秒,且期间至少有10次key的变化时
    3. 时间过了60秒,且期间至少有10000次key的变化时
    

在这里插入图片描述

rdb 文件处理

  • 保存:RDB ⽂件保存再 dir 配置指定的⽬录(默认 /var/lib/redis/)下,⽂件名通过 dbfilename 配置(默认 dump.rdb)指定。可以通过执行 config set dir {newDir} 和 config set dbfilename {newFilename} 运⾏期间动态执行,当下次运行时 RDB ⽂件会保存到新目录。
  • 压缩:Redis 默认采用 LZF 算法对⽣成的 RDB 文件做压缩处理,压缩后的⽂件远远小于内存大小d,默认开启,可以通过参数 config set rdbcompression {yes|no} 动态修改。
  • 校验:如果 Redis 启动时加载到损坏的 RDB 文件会拒绝启动。这时可以使用Redis 提供的 redischeck-dump ⼯具检测 RDB 文件并获取对应的错误报告。

rdb 优缺点

  • RDB 是⼀个紧凑压缩的⼆进制⽂件,代表 Redis 在某个时间点上的数据快照。非常适用于备份,全 量复制等场景。⽐如每 6 小数执行 bgsave 备份,并把 RDB ⽂件复制到远程机器或者⽂件系统中 (如 hdfs)用于灾备。
  • Redis 加载 RDB 恢复数据远远快于 AOF 的⽅式。
  • RDB 方式数据没办法做到实时持久化 / 秒级持久化。因为 bgsave 每次运行都要执行 fork 创建⼦进程,属于重量级操作,频繁执行成本过高。
  • RDB 文件使用特定⼆进制格式保存,Redis 版本演进过程中有多个 RDB 版本,兼容性可能有⻛险。

AOF => Append Only File 实时备份

AOF 类似于 mysql 的binlong,就会把用户的每个操作,都记录到文件中。
当redis重新启动的时候,就会读取这个aof文件中的内容,用来恢复数据。
当开启 AOF 的时候,rdb 文件就不生效了,启动的时候就不再读取rdb文件内容了,以AOF文件为主。
AOF是一个文本文件,默认一般是关闭状态,修改配置文件来开启 AOF 功能。

在这里插入图片描述
其中上面那行表示是否开启 AOF,下面那行表示的是生成的AOF文件名,它生成所存放的路径和 rdb 所在的目录是一样的。

AOF 工作流程

AOF 工作流程图如下:
在这里插入图片描述
步骤1) 所有的写⼊命令会追加到 aof_buf(缓冲区)中。
步骤2) AOF 缓冲区根据对应的策略向硬盘做同步操作。
步骤3) 随着 AOF ⽂件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
步骤4) 当 Redis 服务器启动时,可以加载 AOF 文件进行数据恢复。

AOF 缓冲区刷新策略

Redis 提供了多种 AOF 缓冲区同步⽂件策略,由参数 appendfsync 控制,不同值的含义。默认是 everysec级别。
在这里插入图片描述

  • always::只要写入到缓存区就立即刷新,频率最高的,数据最可靠的,性能最低。
  • everysec:每秒刷新一次缓冲区,频率较低一些,数据可靠性低一些,性能会提高。
  • no:Redis不会主动将写入操作同步到磁盘,而是依赖操作系统来处理磁盘同步。

系统调用 write 和 fsync 说明:

  • write 操作会触发延迟写(delayed write)机制。Linux 在内核提供⻚缓冲区⽤来提供硬盘 IO 性 能。write 操作在写⼊系统缓冲区后⽴即返回。同步硬盘操作依赖于系统调度机制,例如:缓冲区 ⻚空间写满或达到特定时间周期。同步⽂件之前,如果此时系统故障宕机,缓冲区内数据将丢失。
  • fsync 针对单个⽂件操作,做强制硬盘同步,fsync 将阻塞直到数据写⼊到硬盘。

AOF 重写机制

随着命令不断写⼊ AOF,⽂件会越来越⼤,为了解决这个问题,Redis 引⼊ AOF 重写机制压缩⽂件体积。AOF ⽂件重写是把 Redis 进程内的数据转化为写命令同步到新的 AOF ⽂件。
为什么重写后的 AOF 可以变小?有如下原因:

  • 进程内已过期的数据不再写⼊⽂件。
  • 旧的 AOF 中的⽆效命令,例如 del、hdel、srem 等重写后将会删除,只需要保留数据的最终版本。
  • 多条写操作合并为⼀条,例如 lpush list a、lpush list b、lpush list 从可以合并为 lpush list a b c。

较小的 AOF ⽂件一方面降低了硬盘空间占⽤,一方面可以提升启动 Redis 时数据恢复的速度。

AOF 重写过程一样也是分为手动触发和自动触发:

  1. 手动触发
    手动触发:调用 bgrewriteaof 命令
  2. 自动触发
    自动触发:根据 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数确定自动触发时机。
  • auto-aof-rewrite-min-size:表示触发重写时 AOF 的最小文件大小,默认为 64MB。
  • auto-aof-rewrite-percentage:代表当前 AOF 占用小相比较上次重写时增加的比例。

AOF 重写流程

在这里插入图片描述

  1. 执行 AOF 重写请求。
    如果当前进程正在执行 AOF 重写,请求不执⾏。
    如果当前进程正在执行 bgsave 操作,重写命令延迟到 bgsave 完成之后再执行。

  2. 父进程执行 fork 创建子进程。

  3. 重写
    a. 父进程 fork 之后,继续响应其他命令。所有修改操作写⼊ AOF 缓冲区,并根据 appendfsync 策略同步到硬盘,保证旧 AOF ⽂件机制正确。
    b. 子进程只有 fork 之前的所有内存信息,父进程中需要将 fork 之后这段时间的修改操作写⼊AOF 重写缓冲区(即aof_rewrite_buf)中。

  4. 子进程根据内存快照,将命令合并到新的 AOF ⽂件中。

  5. 子进程完成重写
    a. 新⽂件写⼊后,子进程发送信号给父进程。
    b. 父进程把 aof_rewrite_buf 缓冲区内临时保存的命令追加到新 AOF ⽂件中。
    c. ⽤新 AOF ⽂件替换⽼ AOF ⽂件。

混合持久化

混合持久化指的是将Redis的数据同时持久化到磁盘的两种方式的结合使用。
混合持久化将这两种方式结合起来:

  • Redis会定期执行RDB快照,将内存中的数据快照保存到磁盘上的RDB文件中。
  • 同时,Redis会将写操作命令追加到AOF日志中,以保持AOF文件的实时更新。

这样,即使Redis在RDB快照之间崩溃,也可以通过AOF日志还原最后一次快照之后的数据。而且,RDB提供了一个全量备份,可以用于更长时间的数据恢复。

当配置文件中,开启这个选项时,AOF文件内容不是文本文件,而是二进制的。
在这里插入图片描述

持久化流程

当 Redis 启动时,会根据 RDB 和 AOF ⽂件的内容,进⾏数据恢复,具体流程如下:
在这里插入图片描述

总结

  • Redis 提供了两种持久化⽅案:RDB 和 AOF。
  • RDB 视为内存的快照,产⽣的内容更为紧凑,占用空间较⼩,恢复时速度更快。但产⽣ RDB 的开销较⼤,不适合进⾏实时持久化,⼀般⽤于冷备和主从复制。
  • AOF 视为对修改命令保存,在恢复时需要重放命令。并且有重写机制来定期压缩 AOF ⽂件。
  • RDB 和 AOF 都使⽤ fork 创建⼦进程,利⽤ Linux ⼦进程拥有⽗进程内存快照的特点进⾏持久化,尽可能不影响主进程继续处理后续命令。

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

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

相关文章

JVM学习(四)--内存问题分析思路

linux获取jvm当前dump文件 命令行为:jmap -dump:file[文件名] [pid] 然后等待生成dump文件,生成的dump文件就在当前目录下。如下图: 然后就可以下载到本地,用本地jdk里自带的jvisualvm来解析文件。 在用本地的jvisualvm解析之前…

Elasticsearch 优化

Elasticsearch 优化 2.1硬件选择 Elasticsearch 的基础是 Lucene ,所有的索引和文档数据是存储在本地的磁盘中,具体的 路径可在 ES 的配置文件 ../config/elasticsearch.yml 中配置,如下: #----------------------------…

QT Day2!!1.登录跳转界面 2.枚举类型 3.左值与右值4.面试问题

1.作业登录跳转界面 //form.h #ifndef FORM_H #define FORM_H#include <QWidget>namespace Ui { class Form; }class Form : public QWidget {Q_OBJECTpublic:explicit Form(QWidget *parent nullptr);~Form();public slots:void jump_slot();private:Ui::Form *ui; };…

使用Python爬虫采集网络热点

在当今信息爆炸的时代&#xff0c;了解网络热搜词和热点事件对于我们保持时事敏感性和把握舆论动向非常重要。在本文中&#xff0c;我将与你分享使用Python爬虫采集网络热搜词和热点事件的方法&#xff0c;帮助你及时获取热门话题和热点新闻。 1. 网络热搜词采集 网络热搜词是人…

SSM框架-Spring框架核心知识梳理

目录 一、SpringIoC 1.1认识SpringIoC容器 1.2基于xml配置SpringIoC容器 1.3基于xml配置下Bean的生命周期和作用域 1.4 基于xml与注解配置SpringIoC容器 1.5 基于完全注解类配置SpringIoc容器 二、SpringAop面对切面编程 2.1认识SpringAop面向切面编程 2.2SpringAop基…

Windows和Linux环境中安装Zookeeper具体操作

1.Windows环境中安装Zookeeper 1.1 下载Zookeeper安装包 ZooKeeper官网下载地址 建议下载稳定版本的 下载后进行解压后得到如下文件&#xff1a; 1.2 修改本地配置文件 进入解压后的目录&#xff0c;将zoo_example.cfg复制一份并重命名为zoo.cfg,如图所示&#xff1a; 打…

AJAX学习笔记2发送Post请求

AJAX学习笔记1发送Get请求_biubiubiu0706的博客-CSDN博客 继续 AJAX发送POST请求 无参数 测试 改回来 测试 AJAX POST请求 请求体中提交参数 测试 后端打断点 如何用AJAX模拟form表单post请求提交数据呢&#xff1f; 设置请求头必须在open之后,send之前 请求头里的设置好比…

Windows配置SonarQube代码审查工具详细步骤(附带IDEA SonarLint插件使用)

文章目录 环境说明以及准备一. SonarQube的下载与安装二. 添加SonarQube项目三. 使用Maven命令上传代码到SonarQube四. IDEA安装SonarLint插件 环境说明以及准备 本篇博客使用的SonarQube版本为9.8&#xff0c;注意JDK 1.8已经不能支持 NameVersionDownLoad LinkSonarQube9.8…

org.mockito:mockito-core 组件安全漏洞及健康度分析

组件简介 维护者mockito组织许可证类型MIT首次发布2008 年 4 月 29 日最新发布时间2023 年 8 月 27 日GitHub Star14159GitHub Fork2478依赖包24,748依赖存储库145,258 org.mockito:mockito-core是一个流行的 Java 模拟框架&#xff0c;它提供了一个简洁的 API 来创建和使用模拟…

设计模式-7--代理模式(Proxy Pattern)

一、什么是代理模式&#xff08;Proxy Pattern&#xff09; 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许一个对象&#xff08;代理&#xff09;充当另一个对象&#xff08;真实对象&#xff09;的接口&#xff0c;以控制对该对象的…

函数指针与std::function<>对回调函数的实现与性能分析

函数指针与std::function<>都可以作为函数形参&#xff0c;通过接受另一个函数的地址来实现回调函数的功能&#xff0c;但是它们之间的性能差异非常明显。下面分别介绍对回调函数的实现与各自的性能分析。 函数指针与std::function<>对回调函数的实现 先在类中分…

PXE批量装机

目录 前言 一、交互式 &#xff08;一&#xff09;、搭建环境 &#xff08;二&#xff09;、配置dhcp服务 &#xff08;三&#xff09;、FTP服务 &#xff08;四&#xff09;、配置TFTP服务 &#xff08;五&#xff09;、准备pxelinx.0文件、引导文件、内核文件 &#…

l8-d5 字节序

一、主机字节序和网络字节序 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序&#xff0c;分为&#xff1a; 大端字节序 (Big endian) 小端字节序(Little endian) 示例&#xff1a;0x11223344 一般主机当中使用小端字节序 网络通信当中必须使用大端字…

朝夕光年游戏自动化测试实践

朝夕光年是面向全球用户与开发者的游戏研发与发行业务品牌&#xff0c;致力于服务全球玩家&#xff0c;帮助玩家在令人惊叹的虚拟世界中一起玩耍与创造。 在游戏的研发过程中&#xff0c;游戏自动化一直是开展难度较大的工程&#xff0c;具体包括机房机架、设备调度、软件框架、…

【Java 基础篇】Java StringBuffer详解:更高效的字符串处理

在Java编程中&#xff0c;字符串是一个常见的数据类型&#xff0c;用于存储文本信息。然而&#xff0c;与字符串相关的操作可能会导致性能问题&#xff0c;因为字符串是不可变的&#xff0c;每次对字符串进行操作都会创建一个新的字符串对象。为了解决这个问题&#xff0c;Java…

【C++】异常处理详解

本篇文章重点将会对C中的异常的相关处理操作进行详解。希望本篇文章的内容会对你有所帮助。 目录 一、C语言的异常处理 二、C异常 2、1 异常概念 2、2 异常的使用 2、3 异常类 2、4 异常的重新抛出 三、异常的安全与规范 3、1 异常的安全 3、2 异常的规范 四、异常的优缺点 &am…

深入了解Kubernetes(k8s):安装、使用和Java部署指南(持续更新中)

目录 Docker 和 k8s 简介1、kubernetes 组件及其联系1.1 Node1.2 Pod1.3 Service 2、安装docker3、单节点 kubernetes 和 KubeSphere 安装3.1 安装KubeKey3.2 安装 kubernetes 和 KubeSphere3.3 验证安装结果 4、集群版 kubernetes 和 KubeSphere 安装5、kubectl 常用命令6、资…

【易售小程序项目】小程序首页完善(滑到底部数据翻页、回到顶端、基于回溯算法的两列数据高宽比平衡)【后端基于若依管理系统开发】

文章目录 说明细节一&#xff1a;首页滑动到底部&#xff0c;需要查询下一页的商品界面预览页面实现 细节二&#xff1a;当页面滑动到下方&#xff0c;出现一个回到顶端的悬浮按钮细节三&#xff1a;商品分列说明优化前后效果对比使用回溯算法实现ControllerService回溯算法 优…

git企业级使用

1.初始Git 1.1创建Git仓库 要提前说的是&#xff0c;仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制&#xff0c;就必须先创建⼀个仓库出来。创建⼀个Git本地仓库对应的命令为 git init &#xff0c;注意命令要在⽂件⽬录下执⾏&#xff0c;例如&#xff1a;…

docker安装gitlab

安装gitlab sudo docker run --detach \--hostname gitlab \--publish 543:443 --publish 90:80 --publish 222:22 \ --name gitlab \--restart always \--volume $GITLAB_HOME/config:/etc/gitlab \--volume $GITLAB_HOME/logs:/var/log/gitlab \--volume $GITLAB_HOME/data:…