12.redis 持久化

news2024/11/26 18:31:49

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.coloradmin.cn/o/969415.html

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

相关文章

Mybatis学习|动态sql、动态sql标签

动态SQL 什么是动态SQL: 动态SQL就是指根据不同的条件生成不同的SQL语句 动态SQL就是在拼接SQL语句,我们只要保证SQL的正确性,按照SQL的格式,去排列组合就可以了! 搭建环境 创建一个基础工程 1.导包 2.编写配置文件 3.编写实体类 4.编写实…

OS 内存换入换出

当通过逻辑地址得到虚拟地址,但是发现虚拟地址没有对应的页框号时,就要中断,然后从磁盘中找把这一页读进来,再把页表中的影射做好,再接着原来的程序。 缺页中断进行中断处理 getfreepage 得到物理空闲页 下一句从磁…

9.2.tensorRT高级(4)封装系列-自动驾驶案例项目self-driving-深度估计

目录 前言1. 深度估计总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-自动驾驶案例项目self-driving-深度估…

【电路参考】缓启动电路

一、外部供电直接上电可能导致的问题 1、在热拔插的过程中,两个连接器的机械接触,触点在瞬间会出现弹跳,电源不稳,发生震荡。这期间系统工作可能造成不稳定。 2、由于电路中存在滤波或大电解电容,在上电瞬间&#xff…

基于ResNet18网络训练二分类模型

目录 一、背景介绍 二、数据构建 三、模型构建及训练 3.1 采用预训练的权重进行训练 3.2 固定模型的参数,训练过程中不更新 3.3 如何保存训练好的模型? 3.4 如何查看可视化训练过程? 四、模型预测 五、查看网络各层的参数 六、可视…

船舶稳定性和静水力计算——绘图体平面图,静水力,GZ计算(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Navigation2学习笔记--总揽nav2_bringup导航包launch文件

launch文件是一个包的窗口,通过这个窗口我们可以知道一个软件包能干什么,具体调动了什么节点,需要加载什么参数,下面我们从总体看里面每个launch文件的作用。 环境:utuntu20.04 ros2 foxy nav2不同版本大同小异。 …

keil 编译stm32,编译信息释义

文章目录 上图中: Code:表示代码大小,占用 279420 字节。 RO-Data:表示只读数据所占的空间大小,一般是指 const 修饰的数据大小。 RW-Data:表示有初值(且非 0)的可读写数据所占的空…

在Ubuntu上安装CUDA和cuDNN以及验证安装步骤

在Ubuntu上安装CUDA和cuDNN以及验证安装步骤 本教程详细介绍了如何在Ubuntu操作系统上安装CUDA(NVIDIA的并行计算平台)和cuDNN(深度神经网络库),以及如何验证安装是否成功。通过按照这些步骤操作,您将能够…

git企业级使用

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

Elasticsearch、Kibana以及Java操作ES 的快速使用

docker 安装elastic search 、 kibana(可视化管理elastic search) docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1创建docker自定义网络 docker自定义网络可以使得容器之间使用容器名网络互连,默认的网络不会有这功能。 一定…

sqli-labs复现

sqli-labs第一关复现 环境搭建下载phpstudy下载sqli-labs浏览器加载 第一关复现 环境搭建 下载phpstudy phpstudy是一个可以快速帮助我们搭建web服务器环境的软件 官网:https://www.xp.cn/ 这里我选择的是windows 64bit 客户端版本,安装路径为C:\php…

docker 安装xxljob

1. 安装mysql镜像 2.初始化xxljob的数据库和表 一、初始化db:https://codechina.csdn.net/mirrors/xuxueli/xxl-job/-/blob/2.3.1/doc/db/tables_xxl_job.sql 对脚本进行修改,添加ROW_FORMATDYNAMIC 安装xxljob 镜像 docker pull xuxueli/xxl-job-admin:2.3.1 …

networkX-02-基础指标

文章目录 1.度1.1 度1.2 入度1.3 出度1.4 加权度1.5 邻居节点1.5.1 邻居节点计算1.5.2 出度邻居节点1.5.3 入度邻居节点 2.节点数、边数3.最短路径3.1 最短路径(不带权重)3.2 最短路径(带权重) 4.计算图中所有的最短路径 教程仓库地址:github networkx_tutorial imp…

肖sir__设计测试用例方法之等价类02_(黑盒测试)

设计测试用例方法之等价类02_(黑盒测试) 一、掌握常用的设计方法: 黑盒测试方法:等价类、边界值,状态迁移法、场景法、判定表、因果图、正交表,(7种) 经验测试方法:错误推测法、异常…

file.raw和file在formdata中上传时遇到的坑!!

首先是这样,我在写一个表单上传页面的时候,结合elementeplus遇到了需要上传图片文件和视频文件的情况,一顿上网猛搜,经过一二十篇博客浏览下来,找到了三四篇可以参考,但是对于到底是上传file还是file.raw说…

通过ref 操作dom , 点击按钮后跳转到页面指定图片位置

滚动图片到视图 定义了一个名为 scrollToIndex 的函数,它接受一个参数 index。当按钮被点击时,这个函数会被调用,并根据传入的 index 值来滚动到对应的图片。 以 alt 来标记图片位置 alt“Tom” import { useRef } from "react";c…

【开发语言】C语言与Python的互操作详解

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

JDK8安装及系统变量配置(包含错误处理)

jdk安装 一.下载JDK二.安装三.配置系统变量四.可能遇到的问题1.显示已经安装的问题 或者 读取注册表项值失败2.原因3.解决 五.验证安装成功 一.下载JDK JDK下载官网 二.安装 双击之后,一直下一步就ok 三.配置系统变量 1.找到配置系统变量的地方 2.配置系统变…

[E2E Test] Python Behave Selenium 一文学会自动化测试

前言 本文将使用Python Behave与Selenium,和同学们一起认识自动化测试,并附上完整的实践教程。 项目源码已上传:CSDN 郭麻花 Azure Repo python-behave-selenium 核心概念 1. 什么是E2E Test E2E即End-to-end,意思是从头到尾…