1. RDB

        RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和 自动触发,存储的是二进制数据。

1.1 手动触发

使用 save 和 bgsave 命令触发:

  • save:Redis服务主进程阻塞式执行持久化操作,直到RDB过程结束,在此期间 Redis 服务端无法执行客户端的命令,持久化数据量大的情况下,会导致主进程长时间阻塞,使用较少;
  • bgsave:后台执行持久化操作,Redis主进程使用 fork 创建子进程,RDB持久化过程由子进程负责执行,阻塞时间较短,只发生在fork阶段;

1.2 自动触发

  • 自动触发在 Redis 配置文件 redis.conf 中进行配置, 比如:如 "save m n" 表示 m 秒内数据集发生了 n 次修改,自动 RDB 持久化。
  • 从节点进行全量复制操作时,主节点⾃动进行 RDB 持久化,随后将 RDB ⽂件内容发送给从结点。
  • 执行 shutdown 命令关闭 Redis 时,也会执行RDB 持久化。

1.3 持久化流程

    RDB 是快照式的数据保存,常见的持久化操作都是在 后台进行的(bgsave)流程如下:

    1.  检查是否已有持久化进程运行​,如果有就直接返回;
    2. Redis 主进程调用 fork()创建子进程,fork 过程会短暂阻塞主线程(阻塞时间取决于内存大小和系统性能),且由于 父进程创建的子进程和父进程共享数据,详细介绍可见【Linux进程】进程地址空间-CSDN博客
    3. 父进程 fork 完成后,bgsave 命令返回 "Background saving started" 信息并不再阻塞父进程,可以继续响应其他命令。
    4. 子进程创建 RDB ⽂件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换。
    5. 进程发送信号给父进程示完成,父进程更新统计信息

    1.4 RDB文件

    RDB 文件默认在 /var/lib/redis/ 下,文件名通过 dbfilename 配置(默认为 dump.rdb)指定;config set dir {newDir} 和 config set dbfilename  {newFilename} 运行期间动态执行,当下次运行时 RDB 文件会保存到新目录

    Redis 默认采⽤ LZF 算法对生成的 RDB ⽂件做压缩处理,压缩后的⽂件远远小于内存大小,默认开启,可以通过参数 config set rdbcompression {yes|no} 动态修改。

    注意:如果 Redis 启动时加载到损坏的 RDB 文件会拒绝启动。这时可以使用 Redis 提供的 redischeck-dump ⼯具检测 RDB 文件并获取对应的错误报告。

    1.5 优缺点

    优点

    • RDB 是⼀个紧凑压缩的⼆进制⽂件,存储 Redis 在某个时间点上的数据快照。非常适用于备份,全量复制等场景;
    • 数据恢复速度比 AOF 快;

    缺点:

    • 无法实时持久化(每次都会fork创建子进程,该操作属于重量级操作,频繁创建会严重影响性能);
    • RDB 文件使用特定⼆进制格式保存,Redis 版本演进过程中有多个 RDB 版本,兼容性可能有风险。

    2. AOF

    AOF(Append Only File)持久化:以独立日志的方式记录每次的写命令,重启时再重新执行 AOF 文件中的命令达到恢复数据的目的。AOF 的主要作用是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式。

    写入的数据可读性也相对较好,比如:set hello world

    那么在文件中就会追加以下文本:

    *3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n

    2.1 配置 AOF

    开启 AOF 功能需要设置配置:appendonly yes,默认不开启。AOF 文件名通过 appendfilename 配置(默认是 appendonly.aof)设置。保存目录同 RDB 持久化方式⼀致,通过 dir 配置指定;

    2.2 工作流程

    1. 所有的写入命令会追加到 aof_buf(缓冲区)中。

    2. AOF 缓冲区根据对应的策略向硬盘做同步操作。 

    3. 随着 AOF文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。

    4. 当 Redis 服务器启动时,可以加载 AOF 文件进行数据恢复。

    2.3 文件同步

    由于存在缓冲区的缘故,对于缓冲区同步到文件主要分为三种策略:

    可配置值

    说明

    数据安全性

    性能影响

    适用场景

    ​always​

    每次写入命令后立即调用 fsync同步到磁盘,完成后才返回成功响应。

    最高

    性能最低(频繁磁盘 I/O)

    对数据一致性要求极高的场景(如金融交易)

    ​everysec​

    命令先写入内存缓冲区(aof_buf),随后调用 write操作(不立即 fsync)。后台线程每秒执行一次 fsync

    中等

    性能与安全的平衡(推荐默认值)

    大多数生产环境

    ​no​

    命令写入 aof_buf后仅调用 write操作,由操作系统决定何时 fsync(通常间隔 30 秒或缓冲区满)。

    最低

    性能最高(但可能丢失更多数据)

    可容忍少量数据丢失的高吞吐场景

    write 和 fsync说明:

    write:write会触发操作系统的延迟写机制,write 操作在写入系统缓冲区后就会立即返回;同步到硬盘操作依赖于系统调度机制;如果数据在操作系统缓冲区内还没落盘,此时发生断电或系统宕机,那么缓冲区数据就会丢失;

    fsync:针对单个文件操作,做强制硬盘同步,fsync 将阻塞直到数据写入到硬盘;

    2.4 重写机制

    随着命令不断写入 AOF,文件会越来越大,为了解决这个问题,Redis 引⼊ AOF 重写机制压缩⽂ 件体积。

    为什么会越来越大?比如:

    set k1 v1
    set k2 v2
    del k1

    数据实际只存储了 k2 - v2,但存储了三条命令;重写机制可以认为是对 AOF 文件的整理;比如:

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

    AOF 重写过程可以手动动触发和自动触发:

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

    auto-aof-rewrite-min-size:表示触发重写时 AOF 的阈值,默认为 64MB。

    auto-aof-rewrite-percentage:代表当前 AOF 占用大小相比较上次重写时增加的比例。

    2.5 重写流程

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

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

    3. 重写

            3.1 主进程 fork 之后继续响应其他命令,后续所有修改操作会被记录到 aof_buf 中,根据策略进行落盘;

            3.2 子进程只有fork之前的所有内存数据,在子进程重写的期间,父进程需要将修改操作写入 AOF 重写缓冲区中;

    4. 子进程根据内存快照,读取内存中数据,整理后写入到新的AOF文件中;

    5. 完成重写,进行AOF文件替换

            5.1 新文件写入后,子进程发送信号给父进程。

            5.2 父进程把 AOF 重写缓冲区内临时保存的命令追加到新 AOF ⽂件中。

            5.3 用新 AOF 文件替换旧 AOF 文件。

    3. 启动时数据恢复

    当 Redis 启动时,会根据 RDB 和 AOF 文件的内容,进行数据恢复;

    ​当 Redis 重启时,如果 AOF 文件和 RDB 文件同时存在,Redis 会优先使用 AOF 文件进行数据恢复​;

    ​步骤​

    ​行为​

    ​检查 AOF 是否启用​

    如果 appendonly yes(AOF 已启用),则​​跳过 RDB​​,直接加载 AOF 文件。

    ​AOF 文件不存在/损坏​

    如果 AOF 文件不可用(如文件损坏),则尝试加载 RDB 文件作为备用恢复。

    ​AOF 和 RDB 均未启用​

    启动一个空数据集(无持久化数据)。

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

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

    相关文章

    【css】让浏览器支持小于12px的文字

    【css】让浏览器支持小于12px的文字.demo {display: inline-block;/** 使用Webkit引擎的变换属性(主要针对旧版Safari/Chrome) **/-webkit-transform: scale(0.8); }注意:display: inline-block; 一定要加上!1.transform: scale(…

    机器学习-基础入门:从概念到核心方法论

    在人工智能飞速发展的今天,机器学习作为其核心技术,正深刻改变着我们的生活与工作。从 AlphaGo 战胜围棋世界冠军,到日常的智能推荐、人脸识别,机器学习的应用无处不在。本文将从基础概念出发,带你系统了解机器学习的核…

    《Leetcode》-面试题-hot100-动态规划

    题目列表 70. 爬楼梯 简单难度 leetcode链接 118. 杨辉三角 简单难度 leetcode链接 198. 打家劫舍 中等难度 leetcode链接 279.完全平方数 中等难度 leetcode链接 322.零钱兑换 中等难度 leetcode链接 139.单词拆分 中等难度 leetcode链接 300.最长递增子序列 中等难度 l…

    数巅中标中建科技AI知识库项目,开启建筑业数智化新篇章

    AI正以前所未有的迅猛态势渗透进建筑业的每一处脉络。在这场数智化转型浪潮中,AI技术如何与建筑业基因深度融合?如何充分释放数据价值?近日,数巅成功中标中建科技集团有限公司“企业AI知识库研发”项目,这一“大语言模…

    想要PDF翻译保留格式?用对工具是关键

    嘿,朋友!最近有没有被PDF翻译的事儿搞得焦头烂额呀?尤其是碰到韩文PDF文件的时候,是不是更头疼了?别担心,我最近也遇到了类似的问题,试了不少软件,发现有五款软件在处理韩文PDF翻译时…

    【MySQL✨】服务器安装 MySQL 及配置相关操作

    1. 安装 MySQL 在安装 MySQL 时,如果使用官方 RPM 源,会遇到 GPG 密钥验证失败的错误,可以按照以下步骤解决: 解决 GPG 密钥验证失败的问题下载 MySQL 官方 GPG 密钥 使用以下命令下载并安装 MySQL 的官方 GPG 密钥: w…

    大数据量返回方案(非分页)

    一、普通方式返回100万条数据RestController RequestMapping("/bad") public class BadController {Autowiredprivate UserRepository userRepository;/*** 危险&#xff01;一次性加载 100 万条到内存*/GetMapping("/all-users")public List<User> …

    基于Casbin的微服务细粒度权限控制方案对比与实践

    基于Casbin的微服务细粒度权限控制方案对比与实践 随着微服务架构在互联网和企业级应用中的广泛应用&#xff0c;服务间的安全边界愈发重要。传统的集中式权限控制方式已难以满足微服务的高并发、动态扩展和多语言支持等需求。本文将从主流的三种微服务权限控制方案入手&#x…

    5G毫米波现状概述(截止2025 年7月)

    5G毫米波现状概述(截止2025 年7月&#xff09; 原创 modem协议笔记 2025年07月25日 06:01 广东 听全文 当你在体育馆看球赛时&#xff0c;想发段实时视频到朋友圈却总卡成PPT&#xff1b;当郊区的父母抱怨“光纤拉不到家&#xff0c;网速比蜗牛慢”—这些场景背后&#xff…

    thymeleaf 日期格式化显示

    在Thymeleaf中处理日期格式化显示主要有以下几种方式&#xff1a; 1. 使用#dates.format()方法进行基础格式化&#xff1a; <p th:text"${#dates.format(dateObj, yyyy-MM-dd HH:mm:ss)}"></p>这种方法支持自定义格式模式&#xff0c;如yyyy表示年份、MM…

    【经验分享】如何在Vscode的Jupyter Notebook中设置默认显示行号

    【经验分享】如何在Vscode的Jupyter Notebook中设置默认显示行号 打开设置&#xff0c;搜索&#xff1a;Notebook: Line Number&#xff0c;然后把这个设置为on

    蓝桥杯STL stack

    STL stack 概述栈&#xff08;stack&#xff09;是一种遵循**后进先出&#xff08;LIFO&#xff09;**原则的线性数据结构&#xff0c;仅允许在栈顶进行插入和删除操作。STL&#xff08;Standard Template Library&#xff09;中的 stack 是一个容器适配器&#xff0c;基于其他…

    从0到1:飞算JavaAI如何用AI魔法重构MCP服务全生命周期?

    摘要 本文详细介绍了如何利用飞算JavaAI技术实现MCP&#xff08;Model Context Protocol&#xff09;服务的创建及通过的全过程。首先阐述了飞算JavaAI的基本概念、特点和优势&#xff0c;接着对MCP服务的需求进行分析&#xff0c;然后按照软件开发流程&#xff0c;从系统设计、…

    Webpack Loader 完全指南:从原理到配置的深度解析

    掌握 Webpack Loader 的核心机制&#xff0c;解锁前端工程化进阶技能前言&#xff1a;为什么需要理解 Loader&#xff1f; 在现代前端工程化体系中&#xff0c;Webpack 已成为构建工具的事实标准。然而面对非标准 JavaScript 文件或自定义语法时&#xff0c;你是否遇到过 Modul…

    读书笔记:《我看见的世界》

    《我看见的世界.李飞飞自传》李飞飞 著&#xff0c;赵灿 译个人理解&#xff1a; 是本自传&#xff0c;也是AI的发展史 坚持&#xff0c;总会转机&#xff0c;“一不小心”也许就成了算法、大规模数据、原始算力人工智能似乎一夜之间从一个小众的学术领域爆发成为推动全球变革的…

    使用纯NumPy实现回归任务:深入理解机器学习本质

    在深度学习框架普及的今天&#xff0c;回归基础用NumPy从头实现机器学习模型具有特殊意义。本文将完整演示如何用纯NumPy实现二次函数回归任务&#xff0c;揭示机器学习底层原理。整个过程不使用任何深度学习框架&#xff0c;每一行代码都透明可见。1. 环境配置与数据生成 impo…

    java理解

    springboot 打包 mvn install:install-file -Dfile=<path-to-jar> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=jar <path-to-jar> 是你的 JAR 文件的路径。 <group-id> 是你的项目的组 ID。 <…

    图论核心算法详解:从存储结构到最短路径(附C++实现)

    目录 一、图的基础概念与术语 二、图的存储结构 1. 邻接矩阵 实现思路&#xff1a; 2. 邻接表 实现思路&#xff1a; 应用场景&#xff1a; 时间复杂度分析&#xff1a; 三、图的遍历算法 1. 广度优先搜索&#xff08;BFS&#xff09; 核心思想&#xff1a; 应用场…

    力扣top100(day03-02)--图论

    本文为力扣TOP100刷题笔记 笔者根据数据结构理论加上最近刷题整理了一套 数据结构理论加常用方法以下为该文章&#xff1a; 力扣外传之数据结构&#xff08;一篇文章搞定数据结构&#xff09; 200. 岛屿数量 class Solution {// DFS辅助方法&#xff0c;用于标记和"淹没&q…

    建造者模式:从“参数地狱”到优雅构建

    深夜&#xff0c;一条紧急告警刺穿寂静&#xff1a;核心报表服务因NullPointerException全线崩溃。排查根源&#xff0c;罪魁祸首竟是一个拥有10多个参数的“上帝构造函数”。本文将从这个灾难现场出发&#xff0c;引入“链式建造者模式”进行重构&#xff0c;并深入Spring AI、…