Redis学习【8】之Redis RDB持久化

news2024/9/28 11:17:14

文章目录

  • Redis 持久化
    • 1 持久化基本原理
    • 2 RDB(Redis DataBase) 持久化
      • 2.1 持久化的执行
      • 2.2 手动 save 命令
      • 2.3 手动 bgsave 命令
      • 2.4 自动条件触发
      • 2.5 查看持久化时间
    • 3 RDB 优化配置
      • 3.1 save
      • 3.2 stop-write-on-bgsave-error
      • 3.3 rdbcompression
      • 3.4 rdbchecksum
      • 3.5 sanitize-dump-payload
      • 3.6 dbfilename
      • 3.7 rdb-del-sync-files
      • 3.8 dir
    • 4 RDB 文件结构
    • 5 RDB 持久化过程
    • 6 补充写实复制技术

Redis 持久化

  • Redis 是一个内存数据库,所以其运行效率非常高。但是存在一个问题:内存中的数据是不持久的,若主机宕机或 Redis 关机重启,则内存中的数据全部丢失。Redis 具有持久化功能,其会按照设置以快照或操作日志的形式将数据持久化到磁盘。
  • 根据持久化使用技术的不同,Redis 的持久化分为两种:RDB 与 AOF

1 持久化基本原理

![在这里插入图片描述](https://img-blog.csdnimg.cn/8b5f7b524e3e4fb5b5e8baa277fa98f4.png)
  • Redis 持久化称为钝化,是指将内存中数据库的状态描述信息保存到磁盘中。不同的持久化技术,对数据的状态描述信息是不同的,生成的持久化文件也是不同的。但作用都是相同的:避免数据意外丢失
  • 数据恢复过程也称为激活。通过手动方式,或自动定时方式,或自动条件触发方式,将内存中数据库的状态描述信息写入到指定的持久化文件中。当系统重新启动时,自动加载持久化文件,并根据文件中数据库状态描述信息将数据恢复到内存中
  • 钝化与激活的过程就是 Redis 持久化的基本原理。
  • 对于 Redis 单机状态下,无论是手动方式,还是定时方式或条件触发方式,都存在数据丢失问题:在尚未手动/自动保存时发生了 Redis 宕机状况,那么从上次保存到宕机期间产生的数据就会丢失。不同的持久化方式,其数据的丢失率也是不同
    在这里插入图片描述
  • RDB 是默认持久化方式,但 Redis 允许 RDB 与 AOF 两种持久化技术同时开启,此时系统会使用 AOF 方式做持久化,即 AOF 持久化技术的优先级要更高。同样两种技术同时开启状态下,系统启动时若两种持久化文件同时存在,则优先加载 AOF持久化文件。

2 RDB(Redis DataBase) 持久化

  • RDB是指将内存中某一时刻的数据快照全量写入到指定的 rdb 文件的持久化技术
  • RDB 持久化默认是开启的,当 Redis 启动时会自动读取 RDB 快照文件,将数据从硬盘载入到内存,以恢复 Redis 关机前的数据库状态

2.1 持久化的执行

  • RDB 持久化的执行有三种方式:手动 save 命令、手动 bgsave 命令,与自动条件触发

2.2 手动 save 命令

  • 通过在 redis-cli 客户端中执行 save 命令可立即进行一次持久化保存。
  • **save 命令在执行期间会阻塞 redis-server 进程,直至持久化过程完毕。**而在 redis-server 进程阻塞期间,Redis不能处理任何读写请求,无法对外提供服务。
    在这里插入图片描述

2.3 手动 bgsave 命令

  • background save,后台运行 save。
  • bgsave 命令会使服务器进程 redis-server 生成一个子进程,由该子进程负责完成保存过程。在子进程进行保存过程中,不会阻塞 redis-server 进程对客户端读写请求的处理
  • 通过在 redis-cli 客户端中执行 bgsave 命令可立即进行一次持久化保存。
    在这里插入图片描述

2.4 自动条件触发

  • 自动条件触发的本质仍是 bgsave 命令的执行。用户通过在配置文件中做相应的设置后,Redis 会根据设置信息自动调用 bgsave 命令执行。

2.5 查看持久化时间

  • 通过 lastsave 命令可以查看最近一次执行持久化的时间,其返回的是一个 Unix 时间戳

3 RDB 优化配置

  • RDB 相关的配置在 redis.conf 文件的 SNAPSHOTTING 部分
    在这里插入图片描述

3.1 save

在这里插入图片描述

# Save the DB to disk.
#保存DB到磁盘
# save <seconds> <changes> [<seconds> <changes> ...]
#
# Redis will save the DB if the given number of seconds elapsed and it
# surpassed the given number of write operations against the DB.
#如果给定的秒数过去了超过了给定的对DB的写操作数,Redis将保存数据库
#
# Snapshotting can be completely disabled with a single empty string argument
#snapshot可以用一个空字符串参数完全禁用
# as in following example:
# save ""
#
# Unless specified otherwise, by default Redis will save the DB:
#   * After 3600 seconds (an hour) if at least 1 change was performed
#   * After 300 seconds (5 minutes) if at least 100 changes were performed
#   * After 60 seconds if at least 10000 changes were performed
#
# You can set these explicitly by uncommenting the following line.
#
# save 3600 1 300 100 60 100
#除非另有说明,默认情况下Redis会保存DB:
#	 * 3600秒后(一个小时),如果至少执行了一次更改
#  	 *300(5分钟)后,如果执行了至少100次更改
#	 * 如果执行了至少10000次更改,则在60秒后
#你可以通过取消注释下面的行显式设置。
# save 3600 1 300 100 60 100
  • 该配置用于设置快照的自动保存触发条件(save point)。该触发条件是在指定时间段内发生了指定次数的写操作。除非另有规定,默认情况下持久化条件为 save 3600 1 300 100 60 10000
    # save 3600 1 300 100 60 10000
    save 3600 1 # 在 3600 秒(1 小时)内发生 1 次写操作
    save 300 100 # 在 300 秒(5 分钟)内发生 100 次写操作
    save 60 10000 # 在 60 秒(1 分钟)内发生 1 万次写操作
    
  • 如果不启用 RDB 持久化,只需设置 save 的参数为空串即可:save " "

3.2 stop-write-on-bgsave-error

在这里插入图片描述

# By default Redis will stop accepting writes if RDB snapshots are enabled
# (at least one save point) and the latest background save failed.
# This will make the user aware (in a hard way) that data is not persisting
# on disk properly, otherwise chances are that no one will notice and some
# disaster will happen.
#默认情况下,如果启用RDB快照,Redis将停止接受写操作(至少一个保存点)和最新的后台保存失败。
#这将使用户意识到(以一种艰难的方式)数据没有持久化在磁盘上,否则很可能没有人会注意到灾难将会发生。
#
# If the background saving process will start working again Redis will
# automatically allow writes again.
#如果后台保存进程将重新开始工作,Redis将自动允许再次写入。
#
# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
#但是,如果您已经设置了适当的Redis服务器监控和持久性,你可能想要禁用这个功能,以便Redis将继续正常工作,即使磁盘有问题,permissions,等。
  • 默认情况下,如果 RDB 快照已启用(至少一个保存点),且最近的 bgsave 命令失败,Redis将停止接受写入。这样设置是为了让用户意识到数据没有正确地保存到磁盘上,否则很可能没有人会注意到,并会发生一些灾难。当然,如果 bgsave 命令后来可以正常工作了,Redis将自动允许再次写入

3.3 rdbcompression

在这里插入图片描述

  • 当进行持久化时启用 LZF 压缩字符串对象。虽然压缩 RDB 文件会消耗系统资源,降低性能,但可大幅降低文件的大小,方便保存到磁盘,加速主从集群中从节点的数据同步。

3.4 rdbchecksum

在这里插入图片描述

  • 从 RDB5 开始,RDB 文件的 CRC64 校验和就被放置在了文件末尾。这使格式更能抵抗 RDB文件的损坏,但在保存和加载 RDB 文件时,性能会受到影响(约 10%),因此可以设置为 no禁用校验和以获得最大性能。
  • 在禁用校验和的情况下创建的 RDB 文件的校验和为零,这将告诉加载代码跳过校验检查。默认为 yes,开启了校验功能。

3.5 sanitize-dump-payload

在这里插入图片描述

  • 该配置用于设置在加载 RDB 文件或进行持久化时是否开启对 zipList、listPack 等数据的全面安全检测。该检测可以降低命令处理时发生系统崩溃的可能。其可设置的值有三种选择:
    • no:不检测
    • yes:总是检测
    • clients:只有当客户端连接时检测。排除了加载 RDB 文件与进行持久化时的检测。
  • 默认值本应该是 clients,但其会影响 Redis 集群的工作,所以默认值为 no,不检测

3.6 dbfilename

在这里插入图片描述

  • 指定 RDB 文件的默认名称,默认为 dump.rdb

3.7 rdb-del-sync-files

在这里插入图片描述

  • 主从复制时,是否删除用于同步的从机上的 RDB 文件。默认是 no,不删除。
  • 注意:只有当从机的 RDB 和 AOF 持久化功能都未开启时才生效。

3.8 dir

在这里插入图片描述

  • 指定 RDB 与 AOF 文件的生成目录。默认为 Redis 安装根目录

4 RDB 文件结构

  • RDB 持久化文件 dump.rdb 整体上有五部分构成
    在这里插入图片描述
  1. SOF:常量,一个字符串 REDIS,仅包含这五个字符,其长度为 5。用于标识 RDB文件的开始,以便在加载 RDB 文件时可以迅速判断出文件是否是 RDB 文件。

  2. rdb_version:整数,长度为 4 字节,表示 RDB 文件的版本号。

  3. EOF:常量,占 1 个字节,用于标识 RDB 数据的结束,校验和的开始。

  4. check_sum:校验和 check_sum 用于判断 RDB 文件中的内容是否出现数据异常。其采用的是 CRC 校验算法。

    • CRC 校验算法:
      • 在持久化时,先将 SOF、rdb_version 及内存数据库中的数据快照这三者的二进制数据拼接起来,形成一个二进制数(假设称为数 a),然后再使用这个 a 除以校验和 check_sum,此时可获取到一个余数 b,然后再将这个 b 拼接到 a 的后面,形成 databases。
    • 在加载时,需要先使用 check_sum 对 RDB 文件进行数据损坏验证。验证过程:只需将RDB 文件中除 EOF 与 check_sum 外的数据除以 check_sum。只要除得的余数不是 0,就说明文件发生损坏。当然,如果余数是 0,也不能肯定文件没有损坏。
    • 这种验证算法,是数据损坏校验,而不是数据没有损坏的校验。
  5. databases:可以包含任意多个非空数据库。而每个 database 又是由三部分构成:
    在这里插入图片描述

    • SODB:是一个常量,占 1 个字节,用于标识一个数据库的开始。

    • db_number:数据库编号。

    • key_value_pairs:当前数据库中的键值对数据。
      在这里插入图片描述

    • 每个 key_value_pairs 又由很多个用于描述键值对的数据构成。

      • VALUE_TYPE:是一个常量,占 1 个字节,用于标识该键值对中 value 的类型。
      • EXPIRETIME_UNIT:是一个常量,占 1 个字节,用于标识过期时间的单位是秒还是毫秒。
      • time:当前 key-value 的过期时间。

5 RDB 持久化过程

在这里插入图片描述

  • 对于 Redis 默认的 RDB 持久化,在进行 bgsave 持久化时,redis-server 进程会 fork 出一个 bgsave 子进程,由该子进程以异步方式负责完成持久化。而在持久化过程中,redis-server进程不会阻塞,其会继续接收并处理用户的读写请求。

  • bgsave 子进程的详细工作原理如下:
    在这里插入图片描述

    • 由于子进程可以继承父进程的所有资源,且父进程不能拒绝子进程的继承权。所以,bgsave 子进程有权读取到 redis-server 进程写入到内存中的用户数据,使得将内存数据持久化到 dump.rdb 成为可能。
    • bgsave 子进程在持久化时首先会将内存中的全量数据 copy 到磁盘中的一个 RDB 临时文件,copy 结束后,再将该文件 rename 为 dump.rdb,替换掉原来的同名文件。

  • 在进行持久化过程中,如果 redis-server 进程接收到了用户写请求,则系统会将内存中发生数据修改的物理块 copy 出一个副本。等内存中的全量数据 copy 结束后,会再将副本中的数据 copy 到 RDB 临时文件。这个副本的生成是由于 Linux 系统的**写时复制技术(Copy-On-Write)**实现的。

6 补充写实复制技术

  • 写时复制技术是 Linux 系统的一种进程管理技术。
  • 原本在 Unix 系统中,当一个主进程通过 fork()系统调用创建子进程后,内核进程会复制主进程的整个内存空间中的数据,然后分配给子进程。这种方式存在以下问题:
    • 这个过程非常耗时
    • 这个过程降低了系统性能
    • 如果主进程修改了其内存数据,子进程副本中的数据是没有修改的。即出现了数据冗余,而冗余数据最大的问题是数据一致性无法保证。
  • 现代的 Linux 则采用了更为有效的方式:写时复制。子进程会继承父进程的所有资源,其中就包括主进程的内存空间。子进程与父进程共享内存。只要内存被共享,那么该内存就是只读的(写保护的)。而写时复制则是在任何一方需要写入数据到共享内存时都会出现异常,此时内核进程就会将需要写入的数据 copy 出一个副本写入到另外一块非共享内存区域。

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

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

相关文章

代码随想录算法训练营第六十三天| 503.下一个更大元素II、42. 接雨水

Leetcode - 503这题其实和下一个更大元素那题一样&#xff0c;只是说可以找自己前面的元素&#xff0c;那我索性就把遍历范围从本序列延长到两个相同序列。这样某个元素寻找下一个更大元素到本序列末尾后还可以继续往下&#xff0c;也就是从序列头开始找。这里依旧是可以用单调…

初识CSS,美化HTML

CSS称为&#xff1a;层叠样式表&#xff08;Cascading style sheets&#xff09;美化HTML即给页面种的HTML标签设置样式CSS语法规则css要写在head标签的里边&#xff0c;title标签的下面&#xff0c;用style标签框住<head> <title>...</title> <style>…

Delphi 中自定义鼠标指针图像

Dephi中的鼠标指针是可以自由定义的&#xff0c;如果是使用系统提供的图标&#xff0c;那么直接通过可视控件的Cursor属性赋值就可以。例如设置Form的鼠标为 crHourGlass 沙漏&#xff1a;Form1.Cursor : crHourGlass;也可以在设计期&#xff08;IDE环境中&#xff09;直接更改…

几行代码,就写完懒加载啦?

Ⅰ、前言 「懒加载」是网页中非常 常见的&#xff1b;为了减少系统的压力&#xff0c;对于一些电商系统出场频率非常高&#xff1b;那么大家一般用什么方式去实现 「懒加载」 呢 &#xff1f; ① 通过 scroll 的形式&#xff1a; 通过 滚动「scroll」事件&#xff0c;然后去判…

关系抽取概述

关系抽取介绍 关系抽取概念字1988年在MUL大会上提出&#xff0c;是信息抽取的基本任务之一&#xff0c;目的是为了识别出文本实体中的目标关系。 知识图是语义关联的实体&#xff0c;它将人们对物理世界的认知转化为计算机能够义结构化方式理解的语义信息。 关系抽取通过识别实…

LeetCode分类刷题----二叉树

二叉树1.二叉树的递归遍历144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历2.二叉树的迭代遍历144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历3.二叉树的层序遍历102.二叉树的层序遍历107.二叉树的层序遍历||199.二叉树的右视图637.二叉树的层平均…

数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

笔记本加装固态和内存条教程(超详细)

由于笔记本是几年前买的了&#xff0c;当时是4000&#xff0c;现在用起来感到卡顿&#xff0c;启动、运行速度特别慢&#xff0c;就决定换个固态硬盘&#xff0c;加个内存条&#xff0c;再给笔记本续命几年。先说一下加固态硬盘SSD的好处&#xff1a;1.启动快 2.读取延迟小 3.写…

ABB机器人将实时坐标发送给西门子PLC的具体方法示例

ABB机器人将实时坐标发送给西门子PLC的具体方法示例 本次以PROFINET通信为例进行说明,演示ABB机器人将实时坐标发送给西门子PLC的具体方法。 首先,要保证ABB机器人和PLC的信号地址分配已经完成,具体的内容可参考以下链接: S7-1200PLC与ABB机器人进行PROFINET通信的具体方法…

企鹅号是什么,微信视频号和微视的区别

目录 企鹅号是什么 微视是什么 微信视频号是什么 微信视频号和微视的区别 企鹅号是什么 企鹅号是腾讯旗下的一站式内容&#xff08;文本&#xff09;创作运营平台&#xff0c;致力于帮助媒体、自媒体、企业、机构获得更多曝光与关注&#xff0c;、 持续扩大品牌影响力和商…

他是00年的,我们卷不过他...

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条…

Win10耳机有声音麦不能说话怎么办?麦克风说话别人听不到解决方法

网上找了一些解决办法&#xff0c;一般都是重复的&#xff0c;几个设置调来调去也就那样&#xff0c;没什么用 这种问题一般是“老式”一点的台式机会出现&#xff0c;提供的解决办法如下&#xff1a; 首先下载带面板的音频管理器&#xff0c;如realtek高清晰音频管理器&…

分享88个HTML旅游交通模板,总有一款适合您

88个HTML旅游交通模板下载链接&#xff1a;https://pan.baidu.com/s/1pziNhgpC53h3KZy_a-aAFQ?pwdf99e 提取码&#xff1a;f99e Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 HTML5旅行公司旅行社网站模板 HTML5旅行公司旅行社网站模板是一款提供旅行服务的公司…

数据分析spss应急考试

数据分析spss应急考试 前言 单项选择 15(项)*2&#xff08;分&#xff09;30 判断题 10*1 10 计算题 2*10 案例分析题目(考实验内容) 总四十分&#xff0c;分值不等 老师重点强调了回归分析因子分析方差分析参数、非参数检验 2独立样本的非参数检验应该用什么方法多独立样本…

Qt 开发使用VSCode 笔记2

在之前有写过使用VSCode开发QT的笔记 Qt 开发使用VSCode 在以前的基础上继续学习记录写下《Qt 开发使用VSCode 笔记2》 该笔记相比之前的Qt 开发使用VSCode新加了如下内容&#xff1a; 工作区的使用使用Natvis进行Qt感知对象可视化通过vscode创建QT Quick项目 工作区的使用 …

jsp诊疗预约系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp诊疗预约系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用jav…

Java创建对象的方式

Java创建对象的五种方式&#xff1a; &#xff08;1&#xff09;使用new关键字 &#xff08;2&#xff09;使用Object类的clone方法 &#xff08;3&#xff09;使用Class类的newInstance方法 &#xff08;4&#xff09;使用Constructor类中的newInstance方法 &#xff08;5&am…

[MySQL]初识数据库

哈喽&#xff0c;大家好&#xff01;我是保护小周ღ&#xff0c;本期为大家带来的是 MySQL 数据库&#xff0c;也是新的知识&#xff0c;首先我们会初步认识什么是数据库&#xff0c;什么是Mysql 数据库&#xff0c;以及我们 mysql 主要学什么&#xff0c;SQL 语句简单使用&…

如何使用Python创建一个自定义视频播放器

目录 1、安装vlc的64位版本。 2、安装python的vlc模块。 3、编写如下代码&#xff0c;包含了播放&#xff0c;暂停&#xff0c;停止、音量控制功能。 4、来看一看运行结果。 5、如果遇到播放不了的问题&#xff0c;解决方式如下&#xff1a; 这个例子使用VLC作为视频播放器…

【C#个人错题笔记1】

观前提醒 记录一些我不会或者少见的内容&#xff0c;不一定适合所有人 字符串拼接 int a3,b8; Console.WriteLine(ab);//11 Console.WriteLine("ab");//ab Console.WriteLine(a""b);//38 Console.WriteLine("ab"ab);//ab38 Console.WriteLine…