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

news2024/11/26 7:46:33

文章目录

  • 持久化的概念
  • 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.coloradmin.cn/o/2193121.html

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

相关文章

Alignment与Correspondence,用于量化衡量MLLM中视觉特征的视觉语义对齐与视觉结构程度的方法

Alignment与Correspondence,用于量化衡量MLLM中视觉特征的视觉语义对齐与视觉结构程度的方法 FesianXu 20241006 at Wechat Search Team 前言 在多模态大模型(Multimodal Large Language Model, MLLM)中,视觉特征就像…

MySQL 篇-深入了解存储引擎、索引(InnoDB 索引结构 B+Tree、索引使用规则)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 存储引擎概述 1.1 存储引擎 - InnoDB 1.2 存储引擎 - MyISAM 1.3 存储引擎 - Memory 1.4 存储引擎 - 选择 2.0 索引概述 2.1 索引结构 2.1.1 索引结构 - B-Tree 2…

Docker:安装 MongoDB 的详细指南

请关注微信公众号:拾荒的小海螺 博客地址:http://lsk-ww.cn/ 1、简述 MongoDB 是一个流行的 NoSQL 数据库,可以在 Docker 容器中轻松安装和运行。本文将介绍如何在 Docker 中安装 MongoDB,并展示如何在 Java 应用中使用 MongoDB…

MySQL事务日志—redo日志介绍

MySQL事务日志—redo日志 事务有4种特性: 原子性、一致性、隔离性和持久性。 那么事务的四种特性到底是基于什么机制实现? 事务的原子性、一致性由事务的 undo 日志事务的隔离性由锁机制和MVCC实现。事务的持久性由redo 日志来保证。 两类日志概述:…

基于猎豹优化算法(The Cheetah Optimizer,CO)的多无人机协同三维路径规划(提供MATLAB代码)

一、猎豹优化算法 猎豹优化算法(The Cheetah Optimizer,CO)由MohammadAminAkbari等人于2022年提出,该算法性能高效,思路新颖。 参考文献: Akbari, M.A., Zare, M., Azizipanah-abarghooee, R. et al. The…

‌在Python中,print(f‘‘)是什么?

‌在Python中,print(f’)表示使用f-string对字符串进行格式化输出。‌ f-string是Python 3.6及以上版本引入的一种新的字符串格式化机制,它允许在字符串中直接嵌入表达式,这些表达式在运行时会被其值所替换。使用f-string可以更方便地将变量的…

【通信协议】一文学会异步、同步、串行、并行、单工、半双工、全双工(一)

通信方式详解:异步、同步、串行、并行、单工、半双工、全双工 引言一、通信方式分类概述二、串行通信与并行通信串行通信 (Serial Communication)并行通信 (Parallel Communication)串行与并行通信对比表 三、全双工、半双工、单工通信单工通信 (Simplex Communicat…

怎么将mp4转换为mp3?教你6种值得收藏的视频转音频方法!

怎么将mp4转换为mp3?自媒体生活如此繁华的现在,我们经常需要从视频中提取音频,以便在不同的设备或场合中播放,又或者提取视频中的音频进行二次视频/音频/故事创作,因此,将MP4视频文件转换为MP3音频文件变成…

了解奈奎斯特采样定律和频率混叠:数字信号处理中的关键概念

在数字信号处理和通信领域,采样是将连续信号转化为离散数字信号的关键步骤。采样的过程虽然看似简单,但其中蕴含着深刻的理论,直接关系到信号重建的准确性。而奈奎斯特采样定律和频率混叠就是其中两个非常重要的概念。本文将带您深入了解这两…

基金好书入门阅读笔记《基金作战笔记:从投基新手到配置高手的进阶之路》2

买基金,说到底是买基金所持有的一揽子资产。那么,常见的可投资产都有哪些类型呢? 图2.9进行了系统性的梳理,我们把资产分为四大类,分别是权益类、固收类、现金和另 类,下面就一一解读。 年化收益率是把一段…

L111213 【哈工大_操作系统】内核级线程内核级线程实现操作系统之“树”

L2.4 内核级线程 切换进程,实际上是切换内核级线程,没有用户级进程说法,进程只能在内核中。 多核与多处理器的区别在于是否共用资源。多核多线程 并发:同时触发,交替执行,在一个核上 并行:同…

《数字图像处理基础》学习01-数字图像处理的相关基础知识

这篇文章只是对数字图像处理的相关基础知识有个大概的了解,之后的文章会接着补充和扩展。 目录 一,图像的基本概念 1,图像 2,图像的分类 1)物理图像 2)虚拟图像 二,数字图像处理 三&…

Jenkins Pipline流水线

提到 CI 工具,首先想到的就是“CI 界”的大佬--]enkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很…

常见的src漏洞挖掘之信息收集打点篇

💗想加内部圈子,请联系我! 💗文章交流,请联系我!🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 一个想当文人的黑客 ,很高兴认识大家~ ✨主…

Java IO流全面教程

此笔记来自于B站黑马程序员 File 创建对象 public class FileTest1 {public static void main(String[] args) {// 1.创建一个 File 对象,指代某个具体的文件// 路径分隔符// File f1 new File("D:/resource/ab.txt");// File f1 new FIle("D:\\…

子比主题美化 – 添加天气教程

前言 经常看到很多的网站顶部或者侧边有显示天气状态的小条幅,看着也美观,寻思着也在自己的小站上显示天气。大体的思路是能识别用的ip地址来确认位置然后以代码形式在前台显示出。 经过在百度上搜索一番,发现一个很不错的天气api&#xff…

VMware ESXi Centos7网卡名称 ens192 变更eth0

1.在 /etc/sysconfig/network-scirpts/ 文件夹下 创建一个ifcfg-eth0的文件, 最简单的方式是 mv ifcfg-ens192 ifcfg-eth0 然后 vi ifcfg-eth0 把DEVICE改成 DEVICEeth0 wq! 保存 2. vi /etc/sysconfig/grub # 在位置添加 net.ifnames0 biosdevname0 参数 完…

数据结构之红黑树实现(全)

一、红黑树 红黑树是一种自平衡的二叉搜索树,它通过约束节点的颜色和结构来保持平衡。红黑树是由 Rudolf Bayer 在1972年发明的,被认为是一种优秀的平衡树结构,广泛应用于各种数据结构和算法中。 1.红黑树的性质 1. 每个结点是红的或者黑的…

detectron2/data/catalog.py源码笔记

公开接口是DatasetCatalog对象,MetadataCatalog对象和Metadata类 DatasetCatalog.register(name, func) #用于注册函数 DatasetCatalog.get(name) #返回函数调用结果return func() DatasetCatalog.list() #return list(self.keys()) Datase…

Windows系统编程(三)进程与线程二

进程与线程 进程:直观的说就是任务管理器中各种正在运行的程序。对于操作系统来说,进程仅仅是一个数据结构,并不会真实的执行代码 线程:通常被称作但并不真的是轻量级进程或实际工作中的进程,它会真实的执行代码。每…