详解Redis持久化(上篇——RDB持久化)

Redis持久化的作用和意义

Redis 持久化是一种机制,用于将内存中的数据写入磁盘,以保证数据在服务器重启时不会丢失。持久化是为了解决内存数据库(如 Redis)在服务器关闭后,数据丢失的问题。 Redis 持久化的主要作用和意义为以下:

  1. 数据保护: 持久化确保在发生故障或服务器重启时,已存储在内存中的数据可以被恢复。这对于需要长期存储和保护数据的应用场景非常重要。

  2. 持久存储: 将数据持久化到磁盘上,可以在服务器重新启动时重新加载数据,从而确保数据的持久存储。

  3. 数据恢复: 持久化提供了一种在系统崩溃或断电的情况下能够快速恢复数据的方法。通过定期保存快照或者记录每次写操作,可以最大限度地减少数据丢失的可能性。

  4. 备份和迁移: 持久化的数据可以被用于创建备份,以便在需要时还原数据。同时,可以通过将持久化文件迁移到其他服务器,实现数据的迁移和共享。

  5. 避免内存溢出: 如果 Redis 中的数据集非常大,超过了系统的可用内存,那么持久化可以防止因内存溢出而导致的数据丢失。

Redis 提供了两种主要的持久化方式:

  • RDB 持久化: 将 Redis 数据在指定时间间隔内写入磁盘,生成一个快照文件。这种方式适用于数据集较大时的快速备份和还原。

  • AOF 持久化: 将每次写操作追加到一个文件中,以记录数据库状态的变化。这种方式适用于需要更精确的数据恢复,但相对来说,文件体积可能较大。

而我们这篇文章就会来详细解读RDB持久化的过程

 详解RDB持久化

RDB(Redis DataBase)持久化是 Redis 数据库一种持久化机制,用于将内存中的数据保存到磁盘上,以防止数据在重启时丢失。RDB 持久化的主要作用是将当前时刻的数据库状态保存到一个二进制文件中,这个文件通常以 .rdb 为扩展名。

下面是 RDB 持久化的详细解释:

RDB 持久化的触发方式

RDB 持久化可以通过以下两种方式触发:

 

  1. 手动触发: 可以使用 SAVEBGSAVE 命令来手动触发 RDB 持久化。(如上图所示)

    • SAVE 命令会阻塞 Redis 服务器,直到 RDB 持久化完成为止。
    • BGSAVE 命令会在后台执行,不会阻塞 Redis 服务器,允许继续处理其他请求。
  2. 自动触发: Redis 还可以通过配置redis.conf文件后达到一定条件时自动触发 RDB 持久化,比如在一定时间内发生了一定数量的写操作。(如下图所示)

 

RDB 持久化的过程

 

RDB 持久化的过程可以概括为以下几个步骤:(如上图所示)

  1. 触发持久化: 当触发条件满足时,Redis 将会执行 RDB 持久化。

  2. 创建数据快照: Redis 会生成一个数据快照,即当前数据库在内存中的数据的副本。

  3. 数据写入临时文件: 将数据快照写入一个临时文件。

  4. 替换旧的 RDB 文件: 当临时文件写入完成后,Redis 会将旧的 RDB 文件替换为新的文件。

  5. 完成持久化: 持久化完成后,Redis 将继续处理其他请求。

RDB 文件的结构

RDB 文件是一个二进制文件,包含了保存了整个数据库状态的数据。文件的结构可以分为以下几个部分:

  • 文件头部: 包含了一个魔数(Magic Number)和版本号等信息,用于标识文件类型和版本。

  • 全局信息: 包含了数据库的基本信息,比如 Redis 服务器的版本、生成 RDB 文件的时间等。

  • 键值对数据: 包含了数据库中的所有键值对的数据。每个键值对都包含键的数据、值的数据以及过期时间等信息。

  • 数据校验和: 用于校验文件完整性的校验和数据。

RDB 持久化的优缺点

优点:
  • 高性能: RDB 持久化是通过快照的方式保存数据,因此在恢复数据时非常快速。
  • 紧凑: RDB 文件是二进制格式,相对于文本格式更加紧凑,占用的磁盘空间相对较小。
缺点:
  • 可能丢失数据: 如果在两次持久化之间发生故障,可能会导致一定时间内的数据丢失。
  • 不适用于大规模数据: 对于大规模数据的数据库,生成快照和持久化会占用较多的系统资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统计分钟级别的视频在线用户数+列炸裂+repeat函数

统计分钟级别的视频在线用户数 1、原始数据如下: uid vid starttime endtime select aa as uid,v00l as vid,2023-10-25 12:00 as starttime,2023-10-2512:15 as endtime union select bb as uid,v002 as vid,2023-10-25 12:05 as starttime,2023-10-25 12:19 …

【计算机组成原理】

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

springboot苍穹外卖实战:九、缓存菜品(手动用redisTemplate实现缓存逻辑)+缓存套餐(Spring cache实现)

缓存菜品 缺点 缓存和数据库的数据一致性通常解决方案:延时双删、异步更新缓存、分布式锁。 该项目对于缓存菜品的处理较为简单,实际可以用管道技术提高redis的操作效率、同时cache自身有注解提供使用。 功能设计与缓存设计 建议这部分去看下原视频&…

LeetCode算法心得——高级访客(模拟枚举+小窗口)

大家好,我是晴天学长,今天的周赛第二题,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1) .高级访客 给你一个长度为 n 、下标从 0 开始的二维字符串数组 access_times 。对于每个 …

NetSuite 固定资产报表自定义原理及应用

NetSuite固定资产模块一直处于功能迭代更新中,目前23.2的版本能够支持报表的局部自定义,比如增加原值或已折旧期间,甚至固定资产自定义字段等。但是当我们在实际项目中,会遇到一些挑战,例如: 固定资产原值…

Python:Unittest框架快速入门:用例、断言、夹具、套件、HTML报告、ddt数据驱动

快速看了套Unittest的入门教程 软件测试全套资料赠送_哔哩哔哩_bilibili软件测试全套资料赠送是快速入门unittest测试框架!全实战详细教学,仅此一套!的第1集视频,该合集共计11集,视频收藏或关注UP主,及时了…

servlet 的XML Schema从哪边获取

servlet 6.0的规范定义: https://jakarta.ee/specifications/servlet/6.0/ 其中包含的三个XML Schema:web-app_6_0.xsd、web-common_6_0.xsd、web-fragment_6_0.xsd。但这个页面没有给出下载的链接地址。 正好我本机有Tomcat 10.1.15版本的源码&#…

【Web自动化测试】如何生成高质量的测试报告

运行了所有测试用例,控制台输入的结果,如果很多测试用例那也不能够清晰快速的知道多少用例通过率以及错误情况。 web自动化测试实战之批量执行测试用例场景: 运行 AllTest.py 文件后得到的测试结果不够专业,无法直观的分析测试结果,我们能否…

文心一言 VS 讯飞星火 VS chatgpt (133)-- 算法导论11.2 5题

五、用go语言,假设将一个具有n个关键字的集合存储到一个大小为 m 的散列表中。试说明如果这些关键字均源于全域U,且|U|>nm,则U 中还有一个大小为n 的子集,其由散列到同一槽位中的所有关键字构成,使得链接法散列的查…

数据结构:树的存储结构(孩子兄弟表示法,树和森林的遍历)

目录 1.树的存储结构1.双亲表示法(顺序存储)1.优缺点 2.孩子表示法(顺序链式存储)3.孩子兄弟表示法(链式存储)4.森林与二叉树的转换 2.树的遍历1.先根遍历2.后根遍历3.层序遍历 3.森林的遍历1.先序遍历2.中…

接口自动化测试之Requests模块详解

Python中,系统自带的urllib和urllib2都提供了功能强大的HTTP支持,但是API接口确实太难用了。Requests 作为更高一层的封装,在大部分情况下对得起它的slogan——HTTP for Humans。 让我们一起来看看 Requests 这个 HTTP库在我们接口自动化测试…

阿里云ACK(Serverless)安装APISIX网关及APISIX Ingress Controller

在k8s上安装apisix全家,通过helm安装很简单,但是会遇到一些问题。 安装 首先登录阿里云控制台,在ACK集群详情页,进入CloudShell,执行下面helm命令安装apisix、apisix-ectd、apisix-dashboard和apisix-ingress-contro…

springboot的配置信息的设置和读取(application.properties/application.yml)

springboot提供了两种配置信息的文件格式,application.properties和application.yml,基于直接明了,使用方便和高效的前提下下面的配置均采用yml格式配置, 注意 yml采用缩减方式来排列键后面紧跟冒号,然后空格&#x…

git的分支及标签使用及情景演示

目录 一. 环境讲述 二.分支 1.1 命令 1.2情景演练 三、标签 3.1 命令 3.2 情景演示 ​编辑 一. 环境讲述 当软件从开发到正式环境部署的过程中,不同环境的作用如下: 开发环境:用于开发人员进行软件开发、测试和调试。在这个环境中…

揭秘:车企如何利用5R模式在数位行销领域取得突破

01 车企进入“大逃杀”时间 汽车行业一边是出口“捷报频传”,一边是内销“压力山大”。 内销的难,在之前中部某省的政府“骨折价”补贴掀起的“价格战”中已经可见一斑。这一颇具标志性的事件反映了汽车行业,尤其是燃油车行业正处在巨大的转…

python实现一个简介桌面倒计时小程序

本章内容主要是利用python制作一个简单的桌面倒计时程序,包含开始、重置 、设置功能。 目录 一、效果演示 二、程序代码 一、效果演示 二、程序代码 #!/usr/bin/python # -*- coding: UTF-8 -*- """ author: Roc-xb """import tkin…

HslCommunication模拟西门子读写数据

导入HslCommunication C#端代码(上位机) 这里要注意的是上位机IP用的当前电脑的IP。 using HslCommunication; using HslCommunication.Profinet.Siemens; using System; using System.Collections.Generic; using System.ComponentModel; using Syste…

Linux之基础开发工具gdb调试器的使用(三)

文章目录 一、Linux调试器-gdb使用1、安装gdb2、背景3、Debug和release4、区分Debug和release 二、Linux调试器-gdb命令演示1、显示指定行之后的代码(自动记录最后一条指令)2、断点1、打印断点2、查看断点3、删除断点4、使能(禁用/开启&#…

基于C#+WPF编写的调用讯飞星火大模型工具

工具源码:https://github.com/lishuangquan1987/XFYun.SparkChat 工具效果截图: 支持流式输出: 其中ApiKey/ApiSecret/AppId需要自己到讯飞星火大模型官网去注册账号申请,免费的。 申请地址:https://xinghuo.xfyun.cn/ 注册之…

Leetcode—2469.温度转换【简单】

2023每日刷题(二十六) Leetcode—2469.温度转换 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ double* convertTemperature(double celsius, int* returnSize) {double* ans (double *)malloc(sizeof(do…