写点什么

【Redis 技术进阶之路】「原理分析系列开篇」揭秘分析客户端和服务端网络通信交互实现(服务端篇 - 命令执行过程)

作者:码界西柚
  • 2025-03-18
    江苏
  • 本文字数:3322 字

    阅读完需:约 11 分钟

【Redis技术进阶之路】「原理分析系列开篇」揭秘分析客户端和服务端网络通信交互实现(服务端篇 - 命令执行过程)

【专栏简介】

随着数据需求的迅猛增长,持久化和数据查询技术的重要性日益凸显。关系型数据库已不再是唯一选择,数据的处理方式正变得日益多样化。在众多新兴的解决方案与工具中,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 作为高性能的键值存储系统,其核心职责在于高效地与众多客户端建立并维护网络连接,处理来自这些客户端的多样化命令请求。



在执行这些命令时,Redis 不仅负责在其内部数据库中存储和更新由客户端操作产生的数据,还通过精细的资源管理机制确保服务器自身的稳定运行与性能优化。

命令执行流程

针对于分析服务器内部各组件(如命令解析器、执行引擎、数据存储模块等)如何紧密协作,共同完成命令的接收、解析、执行与响应反馈。

serverCron 函数

serverCron 函数是 Redis 服务器中的核心定时任务处理函数,其重要性不言而喻。深入剖析 serverCron 函数所执行的一系列操作,包括但不限于内存管理(如过期键清理)、持久化任务(如 AOF 和 RDB 文件的写入)、客户端连接管理(如超时检测与断开)、统计信息收集等。

服务启动流程

从启动服务器程序的那一刻起,直至服务器准备就绪,能够接受并处理来自客户端的命令请求,这中间经历了多个关键步骤。逐一揭示这些步骤,包括初始化配置参数、创建网络连接监听、启动后台线程(如 serverCron)、加载持久化数据等。

命令请求的执行过程

探讨一个命令请求从发起至获取响应的全过程时,客户端与服务器之间需紧密配合,历经一系列精心设计的交互步骤。以客户端执行特定命令为例,这一过程不仅仅是简单的信息发送与接收,而是涉及了多个复杂而精细的操作环节。


redis>SET KEY VALUEOK
复制代码


客户端发送 SET KEY VALUE 命令至接收到 OK 回复的过程中,客户端与服务器之间协同工作的细节变得尤为关键。这一周期性的交互涵盖了多个精心编排的步骤,确保了命令的准确传达、高效处理及成功响应。



  1. 客户端发起行动,将SET KEY VALUE的指令请求精准地传递给服务器,启动了数据更新流程的起点。

  2. 服务器接收到来自客户端的SET KEY VALUE指令后,立即启动处理机制。它解析指令内容,随后在内部数据库中执行相应的设置操作,确保数据的一致性与准确性。操作成功后,服务器生成了OK的确认回复,标志着命令的成功执行。

  3. 服务器将这份OK的确认回复封装成网络可识别的数据包,并通过高效的网络通信协议将其安全地传回给客户端,实现了信息的即时反馈。

  4. 客户端在接收到服务器的OK回复后,迅速进行解析与验证,确认操作已成功完成。随后,它以一种直观且友好的方式,将这个成功的反馈呈现给用户,让用户能够即时了解到操作的结果。

发送命令请求

当输入一个命令请求时,客户端立即启动其内置的转换机制,将这一人类可读的命令请求转换为 Redis 协议所规定的格式。这一过程不仅确保了命令的标准化,还使其能够在网络中高效、安全地传输。



客户端利用已经与 Redis 服务器建立的稳定连接一个基于套接字的通信通道,将转换后的协议格式命令请求发送给服务器。通过一个实例来深化这一过程的理解。在 Redis 客户端中,轻轻敲下了这样一个命令:


SET KEY VALUE
复制代码


这个看似简单的指令,实则蕴含了数据存储与检索的复杂逻辑。客户端便迅速响应,将这一人类语言编写的命令,巧妙地转化为 Redis 服务器能够理解的协议格式。转换后的协议内容,以一种结构化的方式展现,如下所示:


*3\r\n$3\r\nSET\r\n$3\r\nKEY\r\n$5\r\nVALUE\r\n
复制代码

读取命令请求

当客户端与服务器之间建立的连接套接字,因客户端的写入操作而变得具备读取条件时,服务器会触发一个机制,该机制随即调用命令请求处理器以执行一系列精心设计的操作。



  • 解析与存储协议命令:服务端读取套接字中按照既定协议格式编排的命令请求,随后将这些精确的数据安全地保存到专为客户端维护的输入缓冲区中。

  • 命令参数的抽取与分类:系统对输入缓冲区内的命令请求进行深入分析,精确地提取出命令请求所蕴含的命令参数及其数量。


系统将这些宝贵的参数及其数量信息,分别精心地存储到客户端状态中的argv(参数值数组)和argc(参数数量)属性里,以便后续命令执行时能够高效访问


  • 执行指定命令:完成了命令参数的准备工作后,系统无缝地调用命令执行器,依据客户端明确指定的命令,启动执行流程。


延续前一小节关于 SET 命令的探讨,程序在成功将命令请求存储至客户端状态的输入缓冲区后,该客户端状态所呈现出的具体形态。



我们针对于对输入缓冲区中的协议进行分析:*3\r\ns3\r\nSET\r\ns3\r\nKEY\r\ns5\r\nVALUE\r\n得出的分析结果保存到客户端状态的 argv 属性和 argc 属性里面。


命令执行器 — 查找命令实现

当命令执行器启动其处理流程时,首要任务是依据客户端请求中的 argv[0]参数,该参数作为标识符,用于在预定义的命令表(command table)中精确检索目标命令。这一查找过程是基于键值对映射的逻辑,其中命令表被巧妙地设计为一个字典结构,其键(key)直接对应于 Redis 支持的各类命令名称,诸如"set"、"get"、"del"等常用操作;而每个键所对应的值(value),则是一个精心构造的 redisCommand 结构体实例。

redisCommand 结构的主要属性

redisCommand 结构体,作为 Redis 命令实现信息的载体,详尽地记录了每个命令的核心属性与功能特性。这些属性包括但不限于命令的处理函数指针、命令的参数数量、命令的读写类型、以及命令执行时的权限检查要求等,它们共同定义了一个 Redis 命令的完整行为轮廓。


sflags 属性的标识
redisCommand

SET 命令,其标识性名称为"set",通过setCommand函数实现具体功能。该命令的参数个数被设定为-3,这一独特设计巧妙地表示 SET 命令能够接收至少三个参数,以灵活应对多样化的数据设置需求。同时,SET 命令被赋予了"wm"标识,这双重标记不仅揭示了其作为写入命令的本质,即能够修改数据库状态,还强调了执行前需对服务器内存状况进行评估的重要性,以防因内存占用过多而导致服务不稳定。



GET 命令则以"get"为名,通过getCommand函数简洁明了地实现了数据检索功能。其参数个数严格设定为 2,明确指出了 GET 命令操作所需的精确参数数量,体现了 Redis 命令设计的严谨性。而"r"标识的赋予,则直观表明了 GET 命令的只读特性,即该命令不会对数据库状态产生任何修改。



服务器内部各组件之间的紧密协作是一个高度复杂而精细的过程,它依赖于各组件之间的高效沟通与协同工作。通过不断优化这一流程,我们可以进一步提升服务器的性能与稳定性,为用户提供更加优质、高效的服务体验。

发布于: 刚刚阅读数: 3
用户头像

码界西柚

关注

🏆 InfoQ写作平台-签约作者 🏆 2020-03-25 加入

👑 优酷资深工程师 | INTJ | 狮子座 | 高洞察力理性自律小i人 📕 个人著作《深入浅出Java虚拟机—JVM原理与实战》 💻 10年开发经验,参与过多个大型互联网项目,定期分享技术干货和项目经验

评论

发布
暂无评论
【Redis技术进阶之路】「原理分析系列开篇」揭秘分析客户端和服务端网络通信交互实现(服务端篇 - 命令执行过程)_redis_码界西柚_InfoQ写作社区