当前位置: 首页 > news >正文

Redis通信协议-RESP协议

一、前言高效通信的基石当我们使用redis-cli执行一条SET name Redis命令时背后发生了一系列精妙的通信过程。客户端如何告诉服务器它想执行什么命令服务器又如何将“OK”这个结果准确无误地返回给客户端这一切的奥秘都藏在 Redis 自研的通信协议——RESPREdis Serialization Protocol之中。RESP 协议是 Redis 客户端与服务端之间沟通的“通用语言”。理解它不仅能让你更深刻地认识 Redis 的工作原理还能帮助你从零开始实现一个自己的 Redis 客户端核心价值RESP 协议以其简单、高效、可读性强和二进制安全的特性成为了 Redis 高性能的基石之一。本文将带你彻底掌握 RESP 协议的五种数据类型、编码规则以及完整的请求-响应流程二、RESP 协议简介2.1 什么是 RESPRESP 全称REdis Serialization ProtocolRedis 序列化协议。它由 Redis 作者 Salvatore Sanfilippo 设计于 Redis 1.2 版本引入并在 Redis 2.0 中成为标准通信协议。虽然它是为 Redis 量身定制的但其简洁的设计使其完全可以应用于其他客户端-服务器C/S软件项目。2.2 核心设计哲学简单性协议格式直观易于人类阅读和程序解析。高效性解析开销极低无需复杂的词法或语法分析器。二进制安全能够安全地传输任何二进制数据不会因为特殊字符如\r\n而产生歧义。可扩展性支持多种数据类型能表达复杂的嵌套结构。三、RESP 的五种数据类型RESP 协议通过在每条消息的开头使用一个特定的字节来标识其数据类型。共有五种基本类型类型首字节描述示例简单字符串 (Simple Strings)用于表示非二进制安全的简单状态或成功消息。不能包含\r或\n。OK\r\n错误 (Errors)-用于返回错误信息。本质上也是一种字符串但客户端应将其视为异常。-ERR unknown command FOO\r\n整数 (Integers):用于表示有符号的64位整数。:1000\r\n批量字符串 (Bulk Strings)$最常用用于表示二进制安全的单个字符串可以包含任意数据包括空值 (null)。$5\r\nhello\r\n$-1\r\n(表示 null)数组 (Arrays)*用于表示元素列表元素可以是任意 RESP 数据类型包括嵌套数组。*2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n⚠️注意所有 RESP 消息都以\r\n(CRLF) 结尾。四、深度解析每种类型的编码规则4.1 简单字符串 (Simple Strings)格式字符串\r\n用途通常用于返回简单的状态码如OK。限制不能包含换行符因此不适用于传输任意数据。// 服务器响应 OK\r\n4.2 错误 (Errors)格式-错误信息\r\n用途当服务器遇到错误时返回。客户端库通常会将此转换为异常抛出。惯例错误信息通常以错误码开头如ERR,WRONGTYPE。// 服务器响应 -ERR Operation against a key holding the wrong kind of value\r\n4.3 整数 (Integers)格式:数字\r\n用途返回整数值如INCR命令的结果、LLEN返回的列表长度等。// 服务器响应 :42\r\n4.4 批量字符串 (Bulk Strings) -重点格式非空字符串$长度\r\n数据\r\n空字符串$0\r\n\r\nNull 值$-1\r\n用途这是传输实际数据如 key, value的主要方式因为它二进制安全。优势通过前置长度接收方可以精确地知道要读取多少字节无需寻找终止符效率极高。// 传输 hello $5\r\nhello\r\n // 传输一个包含换行符的二进制数据 \r\n $2\r\n\r\n\r\n // 表示 GET 一个不存在的 key $-1\r\n4.5 数组 (Arrays) -重点格式*元素数量\r\n元素1元素2...元素N用途客户端发送的所有命令都是以数组形式编码的同时服务器返回复杂结果如LRANGE,HGETALL也用数组。灵活性数组中的每个元素可以是任意 RESP 类型支持嵌套。// 客户端发送命令: SET mykey Hello World *3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$11\r\nHello World\r\n // 服务器响应 LRANGE list 0 -1 (假设list有两个元素 a, b) *2\r\n$1\r\na\r\n$1\r\nb\r\n // 服务器返回一个空列表 *0\r\n五、一次完整的通信流程让我们通过GET mykey这个简单命令走完一次完整的客户端-服务器交互。5.1 客户端 - 服务器 (请求)客户端需要将命令序列化为一个Bulk String 数组。命令本身是一个字符串GET参数mykey是另一个字符串因此请求被编码为*2\r\n$3\r\nGET\r\n$5\r\nmykey\r\n分解*2这是一个包含 2 个元素的数组。$3\r\nGET\r\n第一个元素长度为 3 的字符串 GET。$5\r\nmykey\r\n第二个元素长度为 5 的字符串 mykey。5.2 服务器 - 客户端 (响应)假设mykey的值是Hello服务器会返回一个 Bulk String。$5\r\nHello\r\n如果mykey不存在则返回 Null Bulk String$-1\r\n六、为什么选择文本协议很多人可能会疑惑文本协议不是比二进制协议更“浪费”带宽吗为什么高性能的 Redis 要选择它Redis 作者对此有清晰的解释瓶颈不在网络对于内存数据库而言真正的瓶颈是 CPU 处理命令的逻辑和内存带宽而非网络传输的数据量。节省几个字节的协议头带来的收益微乎其微。极致的简单性文本协议极大地简化了客户端和服务器的实现与调试。你可以直接用telnet或nc连接到 Redis 服务器并手动输入命令进行测试可读性强在抓包分析或日志记录时文本协议的内容一目了然无需额外的解析工具。这种“在非瓶颈处做简单设计”的哲学正是 Redis 成功的关键因素之一。七、结语感谢您的阅读如果你有任何疑问或想要分享的经验请在评论区留言交流
http://www.rkmt.cn/news/1309782.html

相关文章:

  • Linux Ubuntu系统使用Docker搭建vulhub靶场环境
  • 如何高效回收盒马鲜生卡?一文教你方法! - 团团收购物卡回收
  • 空间智能领域服务商官方资质荣誉一览-合规可查 - 速递信息
  • DirectX12画三角形时,GPU命令队列、围栏和资源屏障到底在干嘛?
  • NotebookLM农业科研私密工作流首度公开(含病虫害文献自动溯源、田间日志语义归档、审稿意见预响应三大黑盒功能)
  • Linux SPI用户层调试利器:spi-tools的spi-pipe命令如何帮你做自动化测试?
  • AI赋能IT支持:Gemini3.1Pro工单处理闭环实战
  • 基于检索增强生成(RAG)的私有代码库AI助手部署与调优指南
  • 为什么高性能场景选用PostgreSQL 而不是 MySQL
  • APK Installer:在Windows上安装安卓应用的终极解决方案
  • 如何3分钟搞定全网音乐歌词:163MusicLyrics免费工具终极指南
  • lisa:专为本地AI模型打造的命令行瑞士军刀
  • 【NotebookLM农业科研提效指南】:20年农科专家亲授AI笔记法,3步将文献综述效率提升300%
  • Taotoken的Token Plan套餐在实际项目中的节省效果
  • NotebookLM赋能森林资源监测:5步实现遥感数据→科研洞察的智能跃迁
  • 嵌入式边缘AI实战:基于i.MX93与OpenCV的人脸检测系统开发全流程解析
  • 教育政策分析新范式诞生:NotebookLM如何实时关联OECD/UNESCO/教育部原文并生成对比矩阵?
  • 桌面自动化核心技术:从底层鼠标控制到跨平台实现
  • NotebookLM提示性能断崖式下滑?谷歌内部泄露的2024 Q2提示衰减报告深度解读
  • AI评估框架实战:从YiVal看大模型应用的质量保障体系
  • 终极指南:在Windows上使用APK Installer轻松安装Android应用
  • 2026年全国注会培训机构哪家好 聚焦一对一私教 专注高效通关 - 深度智识库
  • Claude Code用户如何迁移到Taotoken解决封号与token不足困扰
  • CSS Transforms与Filters完全指南
  • 为什么92%的农科博士没用对NotebookLM?——基于217份科研日志的AI使用偏差诊断报告
  • 林业博士都在偷偷用的AI科研助手(NotebookLM林学定制化实战手册)
  • XUnity自动翻译器:5分钟快速上手指南,打破游戏语言壁垒
  • 【会议征稿通知 | 南京师范大学主办 | IEEE出版 | EI 、Scopus稳定检索】第七届电气技术与自动控制国际学术会议(ICETAC 2026)
  • NotebookLM结论生成辅助进阶突破(仅限前500名技术决策者掌握的上下文锚定法)
  • 张可盈多元表演风格令曾志伟“另眼相看” 有演技性格讨喜好感爆棚