【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程

  • 【专栏简介】
    • 【技术大纲】
    • 【专栏目标】
    • 【目标人群】
      • 1. Redis爱好者与社区成员
      • 2. 后端开发和系统架构师
      • 3. 计算机专业的本科生及研究生
  • 初始化服务器
    • 1. 初始化服务器状态结构
      • 初始化`RedisServer`变量
    • 2. 加载相关系统配置和用户配置参数
      • 定制化配置参数
        • 案例分析
          • 更新服务端口号
          • 更新数据库个数
      • 配置覆盖总结
    • 3. 创建和初始化对应的对象结构实例
      • initServer初始化服务器
      • 创建和修改内存数据结构
        • initServer分配内存对象
  • 总结介绍
    • 载入RDB文件或者AOF文件

【专栏简介】

随着数据需求的迅猛增长,持久化和数据查询技术的重要性日益凸显。关系型数据库已不再是唯一选择,数据的处理方式正变得日益多样化。在众多新兴的解决方案与工具中,Redis凭借其独特的优势脱颖而出。

【技术大纲】

为何Redis备受瞩目?原因在于其学习曲线平缓,短时间内便能对Redis有初步了解。同时,Redis在处理特定问题时展现出卓越的通用性,专注于其擅长的领域。深入了解Redis后,您将能够明确哪些任务适合由Redis承担,哪些则不适宜。这一经验对开发人员来说是一笔宝贵的财富。
在这里插入图片描述

在这个专栏中,我们将专注于Redis的6.2版本进行深入分析和介绍。Redis 6.2不仅是我个人特别偏爱的一个版本,而且在实际应用中也被广泛认为是稳定性和性能表现都相当出色的版本

【专栏目标】

本专栏深入浅出地传授Redis的基础知识,旨在助力读者掌握其核心概念与技能。深入剖析了Redis的大多数功能以及全部多机功能的实现原理,详细展示了这些功能的核心数据结构和关键算法思想。读者将能够快速且有效地理解Redis的内部构造和运作机制,这些知识将助力读者更好地运用Redis,提升其使用效率。

将聚焦于Redis的五大数据结构,深入剖析各种数据建模方法,并分享关键的管理细节与调试技巧。

【目标人群】

Redis技术进阶之路专栏:目标人群与受众对象,对于希望深入了解Redis实现原理底层细节的人群

1. Redis爱好者与社区成员

Redis技术有浓厚兴趣,经常参与社区讨论,希望深入研究Redis内部机制、性能优化和扩展性的读者。

2. 后端开发和系统架构师

在日常工作中经常使用Redis作为数据存储和缓存工具,他们在项目中需要利用Redis进行数据存储、缓存、消息队列等操作时,此专栏将为他们提供有力的技术支撑。

3. 计算机专业的本科生及研究生

对于学习计算机科学、软件工程、数据分析等相关专业的在校学生,以及对Redis技术感兴趣的教育工作者,此专栏可以作为他们的学习资料和教学参考。

无论是初学者还是资深专家,无论是从业者还是学生,只要对Redis技术感兴趣并希望深入了解其原理和实践,都是此专栏的目标人群和受众对象

让我们携手踏上学习Redis的旅程,探索其无尽的可能性!


初始化服务器

Redis服务器自启动至具备处理客户端命令请求的能力,需经历一系列严谨的初始化与配置环节

其中涵盖了初始化服务器运行状态加载用户设定的配置参数、构建必要的数据结构体系以及建立网络通信连接等关键步骤。接下来,将对Redis服务器完整的初始化流程展开细致阐述。
在这里插入图片描述


1. 初始化服务器状态结构

初始化服务器的第一步就是创建一个结构体structredisServer类型的实例变量作为服务器的状态,并为结构中的各个属性设置默认值。

初始化RedisServer变量

初始化RedisServer变量的工作由redis.c/initServerConfig函数完成,以下是这个函数最开头的一部分代码:

void initserverConfig(void){//设置服务器的运行id getRandomHexChars(server.runid,REDIS_RUN_ID_SIZE)//为运行id加上结尾字符 server.runid[REDIS_RUN_ID_SIZE] = '\0';//设置默认配置文件路径 server.configfile = NULL;//设置默认服务器频串 server.hz = REDIS_DEFAULT_HZ;//设置服务器的运行架构 server.arch_bits = (sizeof (long) == 8 )64 32;//设置默认服务器端口号 server.port = REDIS_SERVERPORT;
}

以下是initServerConfig函数完成的主要工作:

注意,initServerConfig函数没有创建服务器状态的其他数据结构,数据库、慢查询日志、Lua环境、共享对象这些数据结构在之后的步骤才会被创建出来。

initServerConfig函数执行完毕之后,服务器就可以进人初始化的第二个阶段一载人配置选项。


2. 加载相关系统配置和用户配置参数

在启动服务器时,用户可以通过给定配置参数或者指定配置文件来修改服务器的默认配置。举个例子,如果我们在终端中输人

定制化配置参数

$ \redis-server --port 10086

那么我们就通过给定配置参数的方式,修改了服务器的运行端口号。另外,如果我们在终端中输人:

$ \redis-server redis.conf

并且redis.conf文件中包含以下内容:

#将服务器的数据库数量设置为32个 
databases 32
#关闭RDB文件的压缩功能 
rdbcompression no

那么我们就通过指定配置文件的方式修改了服务器的数据库数量,以及RDB持久化模块的压缩功能。

服务器在用initServerConfig函数初始化完server变量之后,就会开始载人用户给定的配置参数和配置文件,并根据用户设定的配置,对server变量相关属性的值进行修改。

案例分析

例如,在初始化server变量时,程序会为决定服务器端口号的port属性设置默认值

void initServerconfig(void){//默认值为6379 server.port=REDIS_SERVERPORT;
}
更新服务端口号

如果用户在启动服务器时为配置选项port指定了新值10086($ redis-server --port 10086),那么server. port属性的值就会被更新为10086,这将使得服务器的端口号从默认的6379变为用户指定的10086。

更新数据库个数

如果用户在启动服务器时为选项databases设置了值32,那么server. dbnum属性的值就会被更新为32,这将使得服务器的数据库数量从默认的16个变为用户指定的32个。

配置覆盖总结

在这里插入图片描述
服务器在载入用户指定的配置选项,并对server状态进行更新之后,服务器就可以进人初始化的第三个阶段一初始化服务器数据结构。


3. 创建和初始化对应的对象结构实例

在之前执行initServerConfig函数初始化server状态时,程序只创建了命令表一个数据结构,不过除了命令表之外,服务器状态还包含其他数据结构,比如:

  • server.clients(链表):记录了与服务器相连的客户端的状态结构,每个节点包含redisclient结构实例
  • server.db(数组):包含了服务器的所有数据库。
  • server.pubsub channels(字典):保存频道订阅信息,以及保存模式订阅信息的server,pubsub_patterns链表。
  • server.lua:执行Lua脚本的Lua环境
  • server.slowlog:慢查询日志的属性

initServer初始化服务器

初始化服务器进行到这一步,服务器将调用initServer函数,为以上提到的数据结构分配内存,并在有需要时,为这些数据结构设置或者关联初始化值。

注意,服务器到现在才初始化数据结构的原因在于,服务器必须先载入用户指定的配置选项,然后才能正确地对数据结构进行初始化

创建和修改内存数据结构

如果在执行initServerConfig函数时就对数据结构进行初始化,那么一旦用户通过配置选项修改了和数据结构有关的服务器状态属性,服务器就要重新调整和修改已创建的数据结构。

为了避免出现这种麻烦的情况,服务器选择了将server状态的初始化分为两步进行:

  • initServerConfig函数主要负责初始化属性
  • initserver函数主要负责初始化数据结构
initServer分配内存对象
  • 创建进程信号处理器
  • 创建共享复用对象
    • Redis服务器常用的值,像表示 “OK” 回复、“ERR” 回复的字符串对象,以及对应整数1到10000的字符串对象等。服务器复用这些共享对象,避免重复创建相同对象。
  • 创建事件监听器
    • 监听套接字关联连接应答事件处理器,待服务器正式运行时接收客户端连接。
  • 创建时间事件
    • 同时为 serverCron 函数创建时间事件,待服务器运行时执行该函数。
  • 载入AOF文件数据
    • 若AOF持久化功能已开启,打开现有的AOF文件;若文件不存在,则创建并打开新的 AOF 文件,为 AOF 写入操作做准备。
  • 建立I/O处理器模块
    • 初始化服务器的后台I/O模块,为后续的 I/O 操作做好准备。

总结介绍

serverCron函数默认每隔100毫秒执行一次,它的工作主要包括更新服务器状态信息,处理服务器接收的SIGTERM信号,管理客户端资源和数据库状态,检查并执行持久化操作等等。

命令请求从发送到完成主要包括以下步骤:
在这里插入图片描述
服务从启动到能够处理客户端的求需要执行以下步骤:
在这里插入图片描述

载入RDB文件或者AOF文件

服务器依据文件记录还原数据库状态,具体方式取决于AOF持久化功能是否启用:若启用,使用AOF文件还原;若未启用,则使用RDB文件。完成数据库状态还原后,服务器会在日志中记录文件载入及状态还原耗时。

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

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

相关文章

VB.net复制Ntag213卡写入UID

本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …

SQL SERVER 数据库迁移的三种方法!

要将SQL Server从研发环境的把数据库结构(不含数据)迁移至生产环境,可通过以下几种方法实现。以下是具体操作步骤及适用场景: ⚙️ 一、使用SSMS图形界面生成结构脚本(推荐新手) 通过SQL Server Management Studio的生成脚本向导,仅导出数据库架构: ​​连接测试库​​…

C# 快速检测 PDF 是否加密,并验证正确密码

引言:为什么需要检测PDF加密状态? 在批量文档处理系统(如 OCR 文字识别、内容提取、格式转换)中,加密 PDF 无法直接操作。检测加密状态可提前筛选文件,避免流程因密码验证失败而中断。 本文使用 Free Spire…

(33)课54:3 张表的 join-on 连接举例,多表查询总结。数据库编程补述及游标综合例题。静态 sqL与动态sqL(可带参数)

(112)3 张表的 join-on 连接举例 : (113) 多表查询总结 : (114)数据库编程补述 : 综合例题 : 以上没有动手练习,不知道这样的语法是否…

再见 Navicat!一款开源的 Web 数据库管理工具!

大家好,我是 Java陈序员。 在日常的开发工作中,常常需要与各种数据库打交道。而为了提高工作效率,常常会使用一些可视化工具进行操作数据库。 今天,给大家介绍一款开源的数据库管理工具,无需下载安装软件&#xff0c…

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…

函数中的Callable

在编程中,​Callable(可调用对象)​​ 是指任何可以通过 () 操作符调用的对象。在函数和类设计的上下文中,Callable 通常指代可以被调用的实体,例如函数、方法、Lambda表达式或实现了 __call__ 方法的对象。以下是详细…

MySQL学习之触发器

文章目录 前言什么是触发器(Trigger)?触发器的特点 MySQL中触发器的用法创建NEW 与 OLD举例其他操作 注意事项后续内容参考目录 前言 阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论…

AIGC 基础篇 Python基础 04 for循环与while循环

今天,我们来讲Python里面的循环部分 1.for循环 for i in range(1,10,2):print(i) 这是一个简单但是完整的for循环,里面包含了for循环的所有结构 首先注意格式是“for 变量 in range(取得到的起始值,取不到的终点值,步长)” …

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…

每日算法 -【Swift 算法】三数之和最接近目标值

🚀 Swift 实现:三数之和最接近目标值(3Sum Closest) ✨ 前言 在算法学习过程中,经典的“三数之和”系列题目是很多人通往进阶路上的一道坎。今天我们来介绍其中一个非常实用的变种问题 —— 三数之和最接近目标值(3Sum Closest),并使用 Swift 实现一个高效的解法。 …

python打卡day50@浙大疏锦行

知识点回顾: resnet结构解析CBAM放置位置的思考针对预训练模型的训练策略 差异化学习率三阶段微调 ps:今日的代码训练时长较长,3080ti大概需要40min的训练时长 作业: 好好理解下resnet18的模型结构尝试对vgg16cbam进行微调策略 R…

虚幻引擎5-Unreal Engine笔记之SET节点的输出引脚获取设置后的最新变量值

虚幻引擎5-Unreal Engine笔记之SET节点的输出引脚获取设置后的最新变量值 code review! 一个变量的“SET”节点 retrieve 是动词,意思是“检索、获取、取回”。 retrieves 只是当主语是第三人称单数(比如 he、she、it 或单个人/物)时使用的…

编译原理实验 之 TINY 解释测试目标代码

文章目录 实验任务1任务2 本次的实验是在前三次TINYC的基础上的一个测试,所以完成前三次的实验是基础 编译原理 之 实验一 编译原理实验 之 Tiny C语言编译程序实验 语法分析 编译原理实验 之 TINY 之 语义分析(第二次作业 首先将新的文件复制到先前的…

CanFestival移植到STM32G4

文章目录 一、准备工作二、软件配置三、移植CanFestival参考 一、准备工作 1、获取Canfestival源码 2、Python下载 3、wxPython下载 4、CanFestival字典生成 5、安装参考 Python2.7.15及wxPython2.8百度云盘下载地址:https://pan.baidu.com/s/1bRS403m4B31m4ovSJ-_…

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…

第十三章 RTC 实时时钟

第十三章 RTC 实时时钟 目录 第十三章 RTC 实时时钟 1 RTC简介 1.1 主要特性 2 功能描述 2.1 概述 2.2 复位过程 2.3 读RTC寄存器 2.4 配置RTC寄存器 2.5 RTC标志的设置 3 RTC寄存器描述 3.1 RTC控制寄存器高位(RTC_CRH) 3.2 RTC控制寄存器低位(RTC_CRL) 3.3 RTC预…

618来了,推荐京东云服务器

2核2G3M,49元/1年,348元/3年 2核4G5M,149元/1年,518元/3年 4核8G5M,368元/1年,1468元/3年 8核16G5M,1258元/1年,3498元/3年 8核32G10M,1498元/1年,4268元/3年 活动地址:https://3.cn/2hT-F6AX

数据库逻辑删除,唯一性约束究极解决方案

文章目录 一、写在前面二、解决方案1、业务逻辑层面控制2、物理删除数据归档3、is_delete !0的都认为是删除(推荐)4、MySQL 函数索引(表达式索引)(需 MySQL 8.0)(推荐)5、部分索引&a…

3-存储系统

一-基本概念 二-主存储器 三-主存储器与CPU的连接 四-外部存储器 五-高速缓冲存储器 六-虚拟存储器