(五)、Redis的RDB持久化---Redis设计与实现读书笔记

article/2025/10/14 3:15:02

两个用于生成RDB文件的命令

  • save:会阻塞Redis服务器进程,直到RDB文件创建完毕,在阻塞期间,服务器不能处理任何命令请求
  • bgsave:会派生出一个子进程,然后由子进程负责创建RDB文件,服务器经常(父进程)可以继续处理请求

save、bgsave命令本质都是调用rdb.c/rdbSave函数完成RDB文件的创建,只是内部逻辑不一样。

RDB文件载入

RDB文件会在服务器启动时自动完成载入。

由于AOF文件的更新频率通常比RDB文件的更新频率高所以:

  1. 如果服务器开启了AOF持久化功能,服务器优先使用AOF文件来还原数据库
  2. 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库
    在这里插入图片描述
    在这里插入图片描述

bgsave命令执行时服务器状态

服务端在bgsave命令执行期间:

  • 其他客户端发送的save命令会被拒绝,因为同时执行两个rdbSave函数会产生竞争。
  • 其他客户端发送的bgsave命令会被拒绝,因为同时执行两个rdbSave函数会产生竞争。
  • 其他客户端执行bgrewriteaof,bgrewriteaof命令会被延迟到bgsage命令之后执行【如果bgrewriteaof命令正在执行,客户端发送的bgsave命令会被拒绝】

redisServer关于RDB的数据结构

/***Redis 服务器类*/
struct redisServer{...//记录了保存条件的数据struct saveparam *saveparams;//修改计数器long long dirty;//上一次执行保存的时间time_t lastsave;...
}/***save 选项设置的保存条件*/
struct saveparam {//秒数time_t seconds;//修改数int changes;
}
  • saveparams属性:该属性是一个数组,数组中每个元素是一个saveparam结构,每个结构中保存了一个save选项设置的保存条件
  • dirty属性:记录距离上一次成功rdbSave之后,服务队数据库状态进行修改的次数,再下一次rdbSave时会被重置为0
  • lastsave属性:记录服务器上次成功执行rdbSave的时间

RDB文件结构

在这里插入图片描述

  • REDIS:5字节,保存"REDIS"五个字符,通过这一部分,程序在载入RDB文件是可以快速检查该文件是否为RDB文件。
  • db_version:4字节,保存RDB文件的版本号,和redis版本有关
  • databases:长度视情况而定,包含0个或多个数据库,已经数据库中的键值对数据
  • EOF:1字节,标志着RDB文件正文内容结束
  • check_sum:8字节,保存着由程序通过REDIS、db_version、databases、EOF四部分内容进行计算得出的校验和,在载入RDB文件时会重新计算校验和与该字段进行对比,以此来判断RDB文件是否出错或者损坏

databases文件结构

在这里插入图片描述

  • SELECTDB属性:1字节,标志着接下来要读入的将是一个数据库号码
  • db_number属性:1字节、2字节或5字节,保存着一个数据库号码【当程序读取到该属性后会调用select命令,根据读入的数据库号码进行数据库切换】
  • key_value_pairs属性:长度视情况而定,保存了该数据库中所有的键值对数据

key_value_pairs文件结构

不带过期时间:
在这里插入图片描述

  • TYPE属性:value对象的encoding属性即编码类型
  • key属性:保存键值对的键
  • value属性:保存键值对的值

带过期时间:
在这里插入图片描述

  • EXPIRETIME_MS属性:1字节,标志着接下来要读入的将是一个过期时间
  • ms属性:8字节,保存过期时间
  • TYPE属性:value对象的encoding属性即编码类型
  • key属性:保存键值对的键
  • value属性:保存键值对的值

http://chatgpt.dhexx.cn/article/45nH08CA.shtml

相关文章

《redis设计与实现》 读书笔记

《redis设计与实现》 作者:黄健宏 读书笔记 一、前言 什么是redis: Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。简而言之redis就是放在远程网络上的一个key-va…

《Redis设计与实现》阅读:Redis底层研究之简单动态字符串SDS

除仅用于字符串字面量的情况外,对于可以被修改值的字符串的表示,Redis底层并没有采用C语言传统的字符串表示,即以空字符结尾的字符数组,而是采用专门为其设计的简单动态字符串作为其默认字符串表示,其英文全称为Simple…

Redis秒杀功能设计与实现

前言 抢购问题不仅是电商类项目中一个重要的业务,也是许多开发人员在进阶过程中绕不开的问题,关于抢购,如果理清了前后的逻辑和里面涉及到的几个关键性的问题,问题就迎刃而解了 抢购中的几个常见问题 如何设计抢购功能?(表结构,以及整体的抢购思路)不借助中间件如何实…

Redis设计与实现阅读总结(一)数据结构和对象

Redis设计与实现阅读总结(一)数据结构和对象 最近团队几个人和我聊了下,加上我自己平时的反思,我发现自己问题确实很多 其中一个问题就是,自己学习东西没有系统性,没有总结 这次的博客算是一个总结的开始。…

(六)、Redis的AOF持久化---Redis设计与实现读书笔记

redisServer关于AOF的数据结构 /***Redis 服务器类*/ struct redisServer{...//AOF缓存区sds aof_buf;... }当服务器执行完一个写命令后,会一协议格式将被执行的写命令追加到服务器类的aof_buf缓存区的末尾。 AOF文件的写入、同步 写入、同步概念 写入&#xff…

Redis | 第8章 发布订阅与事务《Redis设计与实现》

第8章 发布订阅与事务 前言1. 发布订阅1.1 频道的订阅与退订1.2 模式的订阅与退订1.3 发送消息1.4 查看订阅消息 2. 事务2.1 事务的实现2.2 WATCH 命令的实现2.3 事务的 ACID 性质 最后 前言 参考资料:《Redis设计与实现 第二版》; 第三部分为独立功能…

AOF -- Redis 设计与实现

Redis 分别提供了 RDB 和 AOF 两种持久化机制: RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中。AOF 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件&#xff0c…

Redis设计与实现学习总结

Redis设计与实现学习总结 本文主要对Redis的设计和实现原理做了一个介绍很总结,有些东西我也介绍的不是很详细准确,尽量在自己的理解范围内把一些知识点和关键性技术做一个描述。如有错误,还望见谅,欢迎指出。 这篇文章主要还是参…

Redis的设计与实现(1):5种基本数据结构的底层实现

一、简单的动态字符串(SDS) Redis没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS作为Redis默认的字符串表示。 在Redis里,C字符…

Redis设计与实现总结

本文总结自《Redis设计与实现》一书,只打算总结Redis底层数据结构的实现。Redis的使用参考我的另一篇笔记Redis操作指南。 1 Redis概览 Redis是一个C语言编写的开源、非关系型内存数据库。它底层属于单线程、全内存操作,提供对象共享、引用计数和对象回…

Redis设计与实现

文章目录 第一部分:内部数据结构简单动态字符串(simple dynamic string)双端链表字典跳跃表 第二部分:内存映射数据结构整数集合intset压缩列表 redis数据类型对象处理机制(redisObject)字符串string哈希表hash列表list集合set有续集zset 第四部分&#…

redis的设计与实现

redis的设计和实现 第一部分、数据结构与对象 一、简单动态字符串: 在大多数情况下redis只会使用c字符串作为字面量,在大多情况下,redis使用SDS作为字符串表示。 比起C字符串,SDS具有五种优点: SDS结构里面会有一…

虚拟IP注册Nacos的问题

虚拟IP注册Nacos的问题 问题: A服务器有两个网卡,网卡 lo 绑定了 127.0.0.1 和一个虚拟IP,网卡 eth0 绑定了本地公网IP和一个虚拟IP。同样B服务器的网卡也是相同的配置,A、B服务器拥有的虚拟IP都是同一个地址。 当将A、B服务器部…

天翼云高可用虚拟IP(HAVIP)实践

产品概述 天翼云高可用虚拟IP(High-Availability Virtual IP Address,简称HAVIP)是一种可用独立创建和删除的私有网络IP地址资源。通过在VIP CIDR中申请一个私有网络IP地址,然后与高可用软件(如高可用软件Keepalived&…

云服务器虚拟ip绑定主机,如何在云平台上给云主机中的Keepalived的虚拟IP绑定弹性IP?...

1、 查看Keepalived和网卡配置文件中虚拟IP地址 查看虚拟机keepalived.config配置文件可以看到本地IP地址为172.16.100.109,虚拟IP地址为172.16.100.104。 (图1 Keepalived配置文件) 查看虚拟机网卡的IP地址情况,可以看到本地IP和虚拟IP。 (图2 查看虚拟…

EasyConnect虚拟IP地址未分配

工作中遇到EasyConnect虚拟IP地址未分配,导致无法正常连接服务器进行调测工作。 检查是否安装成功

蒲公英联机平台的服务器虚拟IP,蒲公英客户端如何使用固定虚拟IP管理虚拟局域网的步骤是什么?...

蒲公英异地组网分为路由器成员与客户端成员两种。其中路由器成员下的电脑,可通过本地连接获取的局域网IP进行组网通信访问;而安装并登录了蒲公英客户端成员,则是通过系统随机分配的临时虚拟IP,来进行组网成员的通讯。当成员移除原…

服务器怎么做虚拟ip,如何在服务器上添加虚拟IP?看完原来如此简单!!

写在前面最近,有位小伙伴为了实现Nginx的高可用,在自己的服务器上搭建了一套Nginx集群,Nginx节点的服务器总共有3台。那么问题来了:如何对外只使用一个IP地址,通过某种策略来访问三个服务器节点上的Nginx?答…

LNMP详解(九)——Nginx虚拟IP实战

今天继续给大家介绍Linux运维的相关知识,本文主要内容是Nginx的虚拟IP实战。 一、实战背景 在LNMP详解(七)——Nginx反向代理配置实战一文中,我们实现了如下所示的架构: 在该架构中,Nginx作为反向代理&a…

centos7 配置虚拟ip

环境概览 master:192.168.46.26 slave1:192.168.46.27 测试机:192.168.46.22(用于ping机器) 安装keepalived yum install -y keepalived修改master keepalived.conf 配置文件 vim /etc/keepalived/keepalived.confi…