【Redis】持久化(上)---RDB

文章目录

  • 持久化的概念
  • RDB
    • 手动触发
    • 自动触发
    • `bgsave`命令的运行流程
    • `RDB`文件的处理
    • `RDB`的优缺点
    • `RDB`效果展示

持久化的概念

Redis支持AOFRDB两种持久化机制,持久化功能能有效的避免因进程退出而导致的数据丢失的问题,当下次重启的时候利用之前持久化的文件即可实现数据恢复.
所以此时我们要明确一个常见的误区:Redis不仅仅会将数据保存在内存中,还会将数据保存在磁盘中,实现持久化存储

RDB

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

  • 快照:快照可以理解为把当前内存中存储的数据拍一个照片,生成一个文件,即是一种瞬时的保存
  • RDB:相当于定期备份,把内存中所有的数据写入硬盘中,生成一个快照

手动触发

手动触发的意思就是由 程序员通过Redis客户端来执行持久化的命令

  • save命令:阻塞当前的Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成阻塞时间过长,基本不采用.(Redis单线程,阻塞了Redis接受其他客户端的指令)
  • bgsave命令::Redis进程执行fork操作创建子进程,RDB持久化过程是由子进程负责的,完成之后自动结束.阻塞只发生在fork阶段,一般来说时间比较短 (Redis在主线程中只进行了fork创建子进程的操作)

自动触发

Redis运行自动触发RDB持久化机制,这个触发机制在实战中才是比较有价值的.

  • 使用save配置.如save m n表示m秒内数据集发生了n次修改,自动进行RDB持久化.(可在配置文件中进行修改)
  • 从节点进行全量复制操作时,主节点自动进行RDB持久化,所有将RDB文件发送给从节点
  • 执行shutdown命令关闭Redis时,执行RDB持久化.(使用showdown等命令关闭Redis属于正常关闭,如果发生异常关闭,可能会导致数据的丢失)

bgsave命令的运行流程

在这里插入图片描述

  • 执行bgsave命令,Redis父进程判断当前进程是否存在其他正在执行的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回
  • 父进程执行fork创建子进程,fork过程中父进程会阻塞,通过info stats命令查看last_fork_usec选项,可以获取最近一次fork操作的耗时,单位为毫秒
  • 父进程fork完成之后,bgsave命令返回Background saving started信息不再阻塞父进程,可以相应其他的命令
  • 子进程创建RDB文件.根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换.执行lastsave命令可以获得最后一次生成RDB的时间,对应info统计的rdb_last_save_time选项
  • 进程发送信号给父进程表示完成,父进程更新统计信息

RDB文件的处理

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

RDB的优缺点

优点

  • RDB是一个紧凑压缩的二进制文件,代表Redis某个时间点上的数据快照.非常适用于备份,全量复制等场景.即适合定期备份的场景
  • 由于RDB是以二进制来组织数据,而AOF是以文本的形式来组织数据,所以Redis加载RDB恢复数据远远快于AOF的方式

缺点

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

RDB效果展示

我们先来大致总结一下RDB文件的触发条件:

  • 手动触发:savebgsave,其中最常使用的是bgsave
  • 自动触发:
    • 在配置文件中进行触发条件的配置save m n
    • 正常关闭Redis时,会触发RDB,但是异常关闭Redis时,可能会导致没有触发RDB持久化导致数据丢失

接下来我们使用bgsave来进行RDB效果展示
先展示正常存储的情况:

  • Redis中没有存放任何数据时,我们来观察一下rdb文件中的数据情况
    在这里插入图片描述
  • 接下来向Redis'中存放几个key
    在这里插入图片描述
  • 再执行bgsave,手动触发RDB持久化
    在这里插入图片描述
  • 再来观察RDB文件中的数据改变
    在这里插入图片描述
    我们发现,数据中出现了key1,key2,key3等的身影,说明数据已经被持久化到磁盘文件中了

如果我们不进行bgsave手动触发呢?
我们来看看具体的情况(在执行之前已经清空了所有的数据,恢复到原始状态):

  • 先向Redis中添加几个数据:
    在这里插入图片描述

  • 不执行bgsave直接退出,此时打开rdb文件观察:
    在这里插入图片描述
    没有发现明显的key数据的身影.

  • 再打开Redis观察数据:
    在这里插入图片描述
    这里为什么RDB文件中不存在数据,但是在Redis服务端中还能查询到对应的数据呢?
    这是因为,我们的数据虽然没有被持久化到对应的磁盘文件dump.rdb文件中,但是依旧保存在内存中,所以如果我们在没有断开Redis服务端的情况下,还是可以再一次查询到对应的数据的.但是,如果我们此时模拟异常关闭的情况,即kill -9 Redis-server的进程ID,再启动对应的Redis,我们再来观察数据是否还存在:

  • kill -9 Redis-server的进程ID
    在这里插入图片描述

  • 再启动Redis:redis-server /etc/redis/redis.conf
    在这里插入图片描述

  • 查询数据情况:
    在这里插入图片描述
    此时我们发现,数据不存在,这样便验证了我们的猜想:刚才的数据是存储在内存中的,而不是磁盘中,同时,我们也得出结论:异常关闭会导致数据丢失

接下来我们来验证一下:正常关闭是否会触发RDB持久化行为
redis-cli shutdown属于正常关闭Redis的行为

  • Redis中存放多个数据
    在这里插入图片描述

  • 再执行正常的关闭Redis的行为:redis-cli shutdown,再重启Redis
    在这里插入图片描述

  • 查看其中的数据:
    在这里插入图片描述

  • 查看RDB文件:
    在这里插入图片描述
    发现正常关闭Redis 的行为自动触发RDB持久化行为.

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

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

相关文章

一键生成PPT的AI工具-Kimi!

一键生成PPT的AI工具-Kimi! 前言介绍Kimi为什么选择Kimi如何使用Kimi在线编辑PPT下载生成的PPT自己编辑 结语 😀大家好!我是向阳🌞,一个想成为优秀全栈开发工程师的有志青年! 📔今天不来讨论前后…

启动hadoop后没有 NodeManager和 ResourceManager

跟着黑马网课学下去时发现我的hadoop启动后没有NodeManager和ResourceManager 找到日志的路径 我在/export/server/hadoop/etc/hadoop/hadoop-env.sh文件里配置了日志存放的路径 这里找到你的日志路径,每个人的习惯和看的教程不同,日志放的地方大概率也…

对象比较工具类:实现对业务的修改记录保存(对象字段差异对比)

测试 1:User类 Data NoArgsConstructor AllArgsConstructor public class User {FieldLabel("姓名")private String name;FieldLabel("年龄")private Integer age;FieldLabel("手机")private String phone;FieldLabel("手机号…

OpenEBS 实现 PV 动态持久化存储安装

什么是 OpenEBS OpenEBS 将 Kubernetes 工作节点可用的任何存储转换为本地或复制的 Kubernetes 持久卷。OpenEBS 可帮助应用程序和平台团队轻松部署需要快速、高持久性、可靠且可扩展的容器原生存储的Kubernetes 有状态工作负载。 安装OpenEBS 1.所有节点安装iSCSI启动器 yu…

PostgreSQL学习笔记四:GUI管理工具

PostgreSQL 是一款广泛使用的开源关系数据库管理系统,拥有许多图形用户界面(GUI)工具来帮助用户更高效地管理数据库。以下是一些流行的 PostgreSQL 管理工具: pgAdmin: 一个流行的开源 PostgreSQL GUI 工具&#xff0c…

Graph知识图谱融入向量数据库,带来RAG效果飞升

01. 前言 随着大型语言模型(LLMs)在各种应用中的广泛使用,如何提升其回答的准确性和相关性成为一个关键问题。检索增强生成(RAG)技术通过整合外部知识库,为LLMs提供了额外的背景信息,有效地改…

Linux-sed和gawk

文本处理-sed编辑器 文本处理-gawk程序 文本处理-sed编辑器基础 文本处理-sed编辑器基础-使用地址 文本处理-sed编辑器基础-删除行 文本处理-sed编辑器基础-插入和附加文本 文本处理-sed编辑器基础-修改行/转换命令 文本处理-sed编辑器基础-回顾打印-打印行/打印行号/列出行 文…

「OC」NSArray的底层逻辑和遍历方法

「OC」NSArray的底层逻辑和遍历方法 文章目录 「OC」NSArray的底层逻辑和遍历方法前言NSArray的底层逻辑占位符init后的空NSArray只有单个元素的NSArray大于一个元素的NSArray可变数组NSMutableArray总结图片 遍历NSArray1. for循环2. 枚举3.for—in4. 多线程1.for 循环&fo…

MES管理系统对中小企业有哪些帮助

MES管理系统解决方案对中小企业具有显著的帮助,主要体现在以下几个方面: 一、提升生产效率 MES管理系统能够实时监控生产过程,提供准确的生产数据和及时的反馈。这种实时监控与数据分析能力,使中小企业能够精准把握生产脉搏&…

华为---MUX VLAN简介及示例配置

目录 1. 产生背景 2. 应用场景 3. 主要功能 4. 基本概念 5. 配置步骤及相关命令 6.示例配置 6.1 示例场景 6.2 网络拓扑图 6.3 配置代码 6.4 配置及解析 6.5 测试验证 配置注意事项 1. 产生背景 MUX VLAN(Multiplex VLAN)提供了一种通过VLA…

【JavaScript】JavaScript 与 V8

浏览器中运行 html 和 css 代码: html 和 css 执行过程: js 由 js 引擎(比如现在最为主流的 V8)执行。 高级的编程语言都是需要转成最终的机器指令来执行的;事实上我们编写的JavaScript无论你交给浏览器或者Node执行&…

升级 OpenSSL 的详细步骤(解决 SSH 漏洞的前提)

目录 前言1. 准备工作1.1 安装必要的依赖1.2 下载 OpenSSL 源码 2. 解压和配置2.1 解压文件2.2 配置编译参数 3. 编译和安装3.1 编译源码3.2 安装 OpenSSL 4. 验证安装5. 解决 SSH 漏洞的必要性6. 结语 前言 在信息安全的时代,服务器的安全性至关重要。特别是在互联…

高被引算法GOA优化VMD,结合Transformer-SVM的轴承诊断,保姆级教程!

本期采用2023年瞪羚优化算法优化VMD,并结合Transformer-SVM实现轴承诊断,算是一个小创新方法了。需要水论文的童鞋尽快! 瞪羚优化算法之前推荐过,该成果于2023年发表在计算机领域三区SCI期刊“Neural Computing and Applications”…

智能配音软件哪款好?分享5个搞怪软件

想要让视频或社交媒体内容更加生动有趣?搞笑配音软件是个不错的选择。 无论是嘻哈风格的视频,还是搞怪的段子,合适的配音都能让内容增色不少。 今天,就让我们来探索六个文字配音软件,它们不仅能帮你实现搞笑配音&…

Centos7安装RocketMQ[图文教程]

文章目录 RocketMQ介绍基于Linux服务部署RocketMQ(单机)配置JDK环境下载RocketMQ部署RocketMQ1、解压2、修改VM参数3、配置环境变量4、编写Service文件5、启动服务 基于Docker方式部署RocketMQ安装Docker编写docker-compose文件启动RocketMQ服务 部署Roc…

嵌入式面试——FreeRTOS篇(四) 信号量

本篇为:FreeRTOS信号量篇 信号量 1、什么是信号量 答: 信号量是一种解决同步问题的机制,可以实现对共享资源的有序访问。 2、信号量简介 答: 当计数值大于0,表示有信号量资源。当释放信号量,信号量计数…

SQL 干货 | 使用 EXISTS 编写 SELECT 查询

基于 SQL 中的 EXISTS 运算符为我们提供了一种基于其他数据是否存在(或不存在)来检索数据的简便方法。更具体地说,它是一个逻辑运算符,用于评估子查询的结果,并返回一个布尔值,该值指示是否返回了行。尽管 …

Elasticsearch 实战应用

Elasticsearch 实战应用 引言 Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎,能够快速、实时地处理大规模数据,广泛应用于全文搜索、日志分析、推荐系统等领域。在这篇博客中,我们将从 Elasticsearch 的基本概念入手&#xff…

ubuntu 开放 8080 端口快捷命令

文章目录 查看防火墙状态开放 80 端口开放 8080 端口开放 22端口开启防火墙重启防火墙**使用 xhell登录**: 查看防火墙状态 sudo ufw status [sudo] password for crf: Status: inactivesudo ufw enable Firewall is active and enabled on system startup sudo…

curl执行报【先没有那个文件或目录】解决办法

开发微信发过了curl命令后,执行报错 是空格导致的,解决办法是打开下面网址重新输入空格即可 在线curl命令转代码 删除这个空格 重新输入空格