九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

news2025/2/5 5:01:42

九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

文章目录

  • 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)
  • 1. RDB 概述
  • 2. RDB 持久化执行流程
  • 3. RDB 的详细配置
  • 4. RDB 备份&恢复
  • 5. RDB 持久化小结(优势 和 劣势)
  • 6. 最后:


Redis 持久化-RDB:官网文档地址: https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/

在这里插入图片描述

Redis 关于持久化方案:有两种:

  1. RDB(Redis DataBase)
  2. AOF(Append Of File)

这里我们主要介绍 RDB 持久化方案,AOF 持久化方案,在下一篇文章当中。

1. RDB 概述

RDB 是什么 ?:

在指定的时间间隔内将内存当中的数据集快照写入到磁盘当中,也就是 Snapshot 快照,恢复时将快照文件当中的内容读取到内存 当中。

2. RDB 持久化执行流程

RDB 及其执行流程:

在这里插入图片描述

对上图的解读:

具体流程如下:

  1. Redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令。
  2. 主进程判断当前是否已经存在正在执行的子进程 ,如果存在,那么主进程直接返回。
  3. 如果不存在,正在执行的子进程 ,那么就 fork 一个新的子进程进行持久化数据,fork 过程是阻塞的,fork 操作完成后主进程即可执行其它操作。
  4. 子进程先将数据写入到 临时的 rdb 文件中 ,待快照数据写入完成后,再原子替换旧的 rdb 文件。
  5. 同时发送信号给主进程,通知主进程 rdb 持久化完成,主进程更新相关的统计信息。

小结:

  1. 整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能。
  2. 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。
  3. RDB的缺点是最后一次持久化的数据可能丢失。

如果你是正常关闭 Redis ,仍然会进行持久化,不会造成数据丢失。

如果是 Redis 异常终止/宕机 ,就可能造成数据丢失。

后面在讲解快照配置的时候,进行说明。

Fork&Copy-On-Write:

  1. Fork 的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量,环境变量,程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

  2. 在 Linux 程序中,fork() 会产生一个和父进程完全相同的子进程,但子进程在此后都会 exec 系统调用,出于效率考虑,Linux 中引入了 “写时复制技术 即:copy-on-write” ,有兴趣的可以移步至🌟🌟🌟 https://blog.csdn.net/Code_beeps/article/details/92838520 一位网友的解读。

  3. 一般情况父进程和子进程会共用一段物理内存,只有进程空间的各段的内容要发送变化时,才会将父进程的内容复制一份给子进程。

3. RDB 的详细配置

  1. 默认快照配置:

Redis 当中的快照的文件是名为 dump.rdb 文件,这是默认的。

在 /etc/redis.conf 中配置文件名称当中,存在这个 dump.rdb 的配置。
在这里插入图片描述

如何配置

默认为 Redis 启动时命令行所在的目录下:

意思就是:默认会将 “dump.rdb” 快照文件存储到 Redis 启动时命令行所在的目录下
在这里插入图片描述

重点: 进入到/usr/local/bin 目录下, 启动 Redis, 这个那么这里的 ./ 所指的路径就是 /usr/local/bin , 如果你在 /root/ 目录下启动 Redis , 那么这里 ./ 所指的就是 /root/ 下了路径 , 这点请大家注意。

在这里插入图片描述

那么这样的默认配置就存在一个问题,那就是,如果我们每次去到不同的目录下启动 redis 的化,那么这个dump.rdb(快照存储我们信息/数据的文件) 就会存储到不同的目录下,这样就导致了,如果该目录下没有我们之前执行存储的数据的 dump.rdb 文件的话,我们Redis 就无法读取到该存有我们之前dump.rdb 数据的文件,也就无法恢复我们之前存储操作的数据了。

演示:

我们创建两个目录:分别是: test01,和 test02
在 test01 目录下执行 set k1 "test01"  同时查看该目录下是否生成 dump.rdb(快照文件)
在 test02 目录下执行 set k2 "test02" 同时查看该目录下是否生成 dump.rdb(快照文件)
[root@localhost home]# mkdir test01 # 创建目录

在这里插入图片描述

[root@localhost test01]# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth rainbowsea
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 "test01"
OK
127.0.0.1:6379> keys *
1) "k1"

在这里插入图片描述

在这里插入图片描述

同理执行:test02

在这里插入图片描述

在这里插入图片描述

怎么解决这个,Redis 在不同的目录下,导致数据存储快照不同,数据没有跟上?

我们可以自定义配置好这个 dump.rdb 文件的存放路径,不是默认的dir./(根据启动Redis目录不同而变化) ,而是一直配置在一个固定的路径下。就可以解决这个问题了。

这里我们将其配置到 /root/ 目录下,这样我们每次生成的 dump.rdb 文件就一直是在同一个路径的目录下了

dir /root/

在这里插入图片描述

注意:需要关闭 Redis 服务,重新启动 Redis 服务,配置才会生效

[root@localhost test02]# redis-server /etc/redis.conf
[root@localhost test02]# redis-cli

在这里插入图片描述

在这里插入图片描述

  1. save 和 bgsave
127.0.0.1:6379> save
127.0.0.1:6379> bgsave

在这里插入图片描述

默认的快照配置: 如图:同样是在 `/etc/redis.conf文件当中配置的。
在这里插入图片描述

在这里插入图片描述

注意理解这个时间段的概念.:

在这里插入图片描述

如果我们没有开启 save 的注释 那么在退出,Redis 时 也会进行备份 更新 dump.rdb 文件的。

  • save : save 时只管保存,其它不管,全部阻塞。手动保存,不建议。
  • bgsave: Redis 会在后台异步进行快照操作,快照同时还可以响应客户端请求。
  • 可以通过 lastave 命令获取最后一次成功执行快照的时间(unix 时间戳),可以使用工具转换。https://tool.lu/timestamp/
  1. flushall
  • 执行 flushall 命令,也会产生 dump.rdb 文件,数据为空。
  • Redis Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key )
    在这里插入图片描述

在这里插入图片描述

  1. Save

格式:save 秒钟 写操作次数, 如图

在这里插入图片描述

在这里插入图片描述

RDB 是整个内存的压缩过的 Snapshot,RDB 的数据结构,可以配置复合的快照触发条件

禁用:给 save 传空字符串,可以看文档:

  1. stop-writes-on-bgsave-error
    在这里插入图片描述

意思是:当 Redis 无法写入磁盘的话(比如磁盘满了), 直接关掉 Redis 的写操作。推荐 yes

  1. rdbcompression

在这里插入图片描述

该配置的意思是:

  1. 对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis 会采用 LZF 算法进行压缩。
  2. 如果你不想消耗 CPU 来进行压缩的话,可以设置为关闭此功能,默认 yes。
  1. rdbchecksum

在这里插入图片描述

该配置的意思是:

  1. 在存储快照后,还可以让 redis 使用 CRC64算法来进行数据校验,保证文件是完整的。
  2. 但是这样做会增加大约 10% 的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能,推荐 yes 打开。
  1. 动态停止 RDB:

  2. 动态停止RDB: redis-cli config set save "" ,就是给 save 属性赋值为 ""空字符串,表示禁用保护策略。这里使用命令是让 客户端在此刻,启动的客户端停止 RDB,一旦退出了该客户端就,该配置就失效了。RDB 持久化策略又启动了。


示例演示:

需求: 如果 Redis 的 key 在 30 秒内, 有 5 个 key 变化, 就自动进行 RDB 备份.
在这里插入图片描述

save 30 5

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

4. RDB 备份&恢复

Redis 可以充当缓存,对项目进行优化,因此重要/敏感的数据建议在 MySQL要保存一份。

从设计层面来说,Redis 的内存数据,都是可以重新获取的(可能来自程序,也可能来自MySQL)

因此我们这里说的备份&恢复主要是给大家说明一下 Redis 启动时,初始化数据是从 dump.rdb 来的 整个机制。

演示:

这里我们演示的是:

将我们已经的 dump.rdb 备份文件复制拷贝(备份)一份,复制后之后,再将原来的dump.rdb 文件删除了(模拟文件损坏了,或者是执行 flushall 删除库)。再将我们拷贝备份的 dum.rdb 文件,复制过去,然后重启 redis 读取 dump.rdb 备份文件当中的数据,进行一个数据上的恢复。

config get dir 查询 rdb 文件的目录

127.0.0.1:6379> config get dir

在这里插入图片描述

将 dump.rdb 进行备份 如果有必要可以写 shell 脚本来定时备份 [参考韩顺平老师 Linux 课程定时
,备份 Mysql 数据库视频地址 https://www.bilibili.com/video/BV1Sv411r7vd?p=105 ] 。

[root@localhost ~]# cp /root/dump.rdb /root/dump.rdb.bak

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

在这里插入图片描述

127.0.0.1:6379> flushall

在这里插入图片描述

在这里插入图片描述

注意:这里得关闭一下服务器

在这里插入图片描述

[root@localhost ~]# rm /root/dump.rdb # 删除文件夹

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

关闭 Redis 服务器,重新启动 Redis 服务器,让它读取到我们配置的dump.rdb 备份文件,恢复我们的数据信息。

在这里插入图片描述

5. RDB 持久化小结(优势 和 劣势)

优势:

  1. 适合大规模的数据恢复
  2. 对数据完整性和一致性要求不高更适合使用
  3. 节省磁盘空间
  4. 恢复速度快
    在这里插入图片描述

劣势:

  1. 虽然 Redis 在 fork 时使用了写时拷贝技术(Cop-On-Write) ,但是如果数据庞大时还是比较消耗性能。
  2. 在备份周期在一定间隔时间做一次备份,所以如果 Redis 意外 down 掉 的话(如果正常关闭 Redis仍然会进行 RDB 备份,不会丢失数据),就会丢失最后一次快照后的所有修改。

6. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

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

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

相关文章

小程序越来越智能化,作为设计师要如何进行创新设计

一、用户体验至上 (一)简洁高效的界面设计 小程序的特点之一是轻便快捷,用户期望能够在最短的时间内找到所需功能并完成操作。因此,设计师应致力于打造简洁高效的界面。避免过多的装饰元素和复杂的布局,采用清晰的导航…

(done) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)

网页:https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任务1教会了你如何用 C 语言调用汇编,编译后链接即可) 任务1:Uthread: switching between threads (完成) 在这个练习中,你将设计一个用户级线程系统中的上下文切…

JVM执行流程与架构(对应不同版本JDK)

直接上图(对应JDK8以及以后的HotSpot) 这里主要区分说明一下 方法区于 字符串常量池 的位置更迭: 方法区 JDK7 以及之前的版本将方法区存放在堆区域中的 永久代空间,堆的大小由虚拟机参数来控制。 JDK8 以及之后的版本将方法…

基于开源AI智能名片2 + 1链动模式S2B2C商城小程序视角下的个人IP人设构建研究

摘要:本文深入探讨在开源AI智能名片2 1链动模式S2B2C商城小程序的应用场景下,个人IP人设构建的理论与实践。通过剖析个人IP人设定义中的“诉求”“特质”“可感知”三要素,结合该小程序特点,阐述其对个人IP打造的影响与推动作用&…

刷题汇总一览

文章目录 贪心动态规划数据结构滑动窗口与双指针前缀和动态规划 本题单设计力扣、牛客等多个刷题网站 贪心 贪心后悔 徒步旅行中的补给问题 LCP 30.魔塔游戏 题目使用到的思想解题分析徒步旅行中的补给问题每次我们都加入当前补给点的k个选择,同时进行升序排序&am…

Jupyter Lab的使用

Lab与Notebook的区别: Jupyter Lab和Jupyter notebook有什么区别,这里找到一篇博客不过我没细看, Jupyter Lab和Jupyter Notebook的区别 - codersgl - 博客园 使用起来Lab就是一个更齐全、功能更高级的notebook, 启用滚动输出: 有时候一个…

SpringBoot中关于knife4j 中的一些相关注解

1、效果图 对比可以明显的看到加了注解与没有加注解所表现出来的效果不同(加了注解的更加明了清晰) 2、实现效果 Tag注解‌用于为测试方法或测试类添加标签,以便在执行测试时根据标签进行过滤。使用Tag注解可以更灵活地控制测试的执行&#…

知识管理系统助力企业信息共享与创新思维的全面提升研究

内容概要 知识管理系统的引入极大地改变了企业内部的信息流程与创新机制。通过有效整合与管理组织内的知识资源,这些系统不仅降低了信息孤岛的现象,还提升了员工之间的协作能力。企业在信息共享方面,通过知识管理系统构建了一个透明、高效的…

LLM - 基于LM Studio本地部署DeepSeek-R1的蒸馏量化模型

文章目录 前言开发环境快速开始LM Studio简单设置模型下载开始对话 模型选择常见错误最后 前言 目前,受限于设备性能,在本地部署的基本都是DeepSeek-R1的蒸馏量化模型,这些蒸馏量化模型的表现可能并没有你想象的那么好。绝大部分人并不需要本…

本地部署 DeepSeek-R1:简单易上手,AI 随时可用!

🎯 先看看本地部署的运行效果 为了测试本地部署的 DeepSeek-R1 是否真的够强,我们随便问了一道经典的“鸡兔同笼”问题,考察它的推理能力。 📌 问题示例: 笼子里有鸡和兔,总共有 35 只头,94 只…

对象的实例化、内存布局与访问定位

一、创建对象的方式 二、创建对象的步骤: 一、判断对象对应的类是否加载、链接、初始化: 虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化…

OpenAI推出Deep Research带给我们怎样的启示

OpenAI 又发新产品了,这次是面向深度研究领域的智能体产品 ——「Deep Research」,貌似被逼无奈的节奏… 在技术方面,Deep Research搭载了优化后o3模型并通过端到端强化学习在多个领域的复杂浏览和推理任务上进行了训练。因没有更多的技术暴露…

K8S学习笔记-------1.安装部署K8S集群环境

1.修改为root权限 #sudo su 2.修改主机名 #hostnamectl set-hostname k8s-master01 3.查看网络地址 sudo nano /etc/netplan/01-netcfg.yaml4.使网络配置修改生效 sudo netplan apply5.修改UUID(某些虚拟机系统,需要设置才能生成UUID)#…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户登录

🧸安清h:个人主页 🎥个人专栏:【Spring篇】【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯1.登录-持久层 &…

【Deep Seek本地化部署】模型实测:规划求解python代码

目录 前言 一、实测 1、整数规划问题 2、非线性规划问题 二、代码正确性验证 1、整数规划问题代码验证 2、非线性规划问题代码验证 三、结果正确性验证 1、整数规划问题结果正确性验证 2、非线性规划问题正确性验证 四、整数规划问题示例 后记 前言 模型&#xff…

【游戏设计原理】98 - 时间膨胀

从上文中,我们可以得到以下几个启示: 游戏设计的核心目标是让玩家感到“时间飞逝” 游戏的成功与否,往往取决于玩家的沉浸感。如果玩家能够完全投入游戏并感受到时间飞逝,说明游戏设计在玩法、挑战、叙事等方面达到了吸引人的平衡…

C语言基础系列【1】第一个C程序:Hello, World!

C语言的历史与特点 历史背景 C语言起源于20世纪70年代,最初是由美国贝尔实验室的Dennis Ritchie和Ken Thompson为了开发UNIX操作系统而设计的一种编程语言。在UNIX系统的开发过程中,他们发现原有的B语言(由Thompson设计)在功能和…

【LLM】DeepSeek-R1-Distill-Qwen-7B部署和open webui

note DeepSeek-R1-Distill-Qwen-7B 的测试效果很惊艳,CoT 过程可圈可点,25 年应该值得探索更多端侧的硬件机会。 文章目录 note一、下载 Ollama二、下载 Docker三、下载模型四、部署 open webui 一、下载 Ollama 访问 Ollama 的官方网站 https://ollam…

go-zero学习笔记(三)

利用goctl生成rpc服务 编写proto文件 // 声明 proto 使用的语法版本 syntax "proto3";// proto 包名 package demoRpc;// golang 包名(可选) option go_package "./demo";// 如需为 .proto 文件添加注释,请使用 C/C 样式的 // 和 /* ... */…

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…