Redis RESP协议如何实现

回顾RESP协议

RESP是基于TCP实现Redis通信协议,该协议是以/r/n(行)进行分割的,协议支持5种类型,具体信息如下:

类型 前缀 备注
简单字符串 + 简单字符串以+开头
错误数据 错误数据以-开头
整数 : 整数以:开头
复杂字符串 $ 复杂字符串以$开头
数组 * 数组以*开头

即,我们向redis发送命令:set name pdudo,其实发送的具体信息是

*3$3set$4name$5pdudo

而服务器返回的信息也是类似的,只不过还需要了解+-,这2个前缀分别代表正确消息和错误的消息。

我们准备2个例子,我们来敲一下

例子1

set name pdudo

例子2

lpush pdudo data1lpush pdudo data2lrange pdudo 0 -1

快来动动你的小手指,看能不能根据RESP协议规则,将上述例子命令敲出来。现在你体会到了Redis官网介绍RESP协议时所述的 简单易读 可么?

对于RESP来说,一定要搞清楚协议后,较好能够手写协议去执行,再考虑写程序去实现协议!!!

如何拆解RESP协议

终于到了喜闻乐见的环节了,我们要拆解和组装协议了。 那我们至少来解决如下3个问题:

  • 该协议是基于TCP流的,我们如何判断整个命令什么时候结束?

  • 如何拆解命令?

协议什么时候结束

一般而言,我们自己在使用TCP传输数据,都会在数据开头定义2个或者4个字节,用于存储该数据有多少个字节,这样方便检验接收,类似于这种情况。

Redis RESP协议如何实现

RESP有意思了,它是以/r/n来分割的。最前面会以前缀来判断其类型,例如我们发送命令,其会用到的前缀有*以及$,那么我们如何来判断,我们要读取多少个/r/n呢?

Redis RESP协议如何实现

因为上述*代表数组,即有多少组数据需要处理,图中为n

$表示复杂字符串,即需要获取m个字符数据,不包含/r/n

如何拆解RESP协议

若要拆解命令,则我们得获取命令,如上图所示,报文$m,其实记录的有m长度的数据(不包含rn),所以我们可以这样来写伪代码。

根据如上,我们很容易写出伪代码

func toArgs(rd *bufio.Reader) {	data , _ , _ := rd.ReadLine()	switch data[0] {	case '*':		n := data[1:] // 循环n次		for i:=0;i<n;i++ {			toArgs(rd)		}	case '$':		m := data[1:] // 获取m个数据		// 获取m长度的数据即可	}}

如上我们先获取前缀为*的,继而获取其值n,我们则循环n次,即可获取该报文的数据。而前缀为$的,我们可以直接获取该m长度的数据即可,这里主要要处理一下rn

将命令构建RESP报文规范,根据拆解反操作就可以了,这里暂不介绍了。

上述,我们核心功能已经探讨完毕了。

功能实现

代码已经编写完毕,放置在了gitee上: gitee

如上我们已经学会了如何拆解和组装RESP协议了,我们接着来看,我们如何用go来编写拆解和组装协议的代码呢? 我们可以看。

我们先创建一个字符,然后将其封装为bufio.Reader,我们来看下:

Redis RESP协议如何实现

因为我们要使用readLine()函数,所以我们需要将其转换为bufio.Reader类型,若是直接从net.Conn中获取,不用转换,直接可以使用 bufio.Reader的。

我们将上述伪代码编写一下,实现拆解的功能。

Redis RESP协议如何实现

其具体执行过程是我们先获取一行数据,放置到data中,而后判断其前缀是什么,若是*则取其后面的数据,将其转为int类型n,而后再递归该函数n次,而后中遇到$,我们则取后面的数据,也是将其转为int类型m,而后再取m长度的实际数据,这就是我们的命令了,最后我们再踢掉命令的rn即可。

其中,有一个函数是byteToInt是我们自己写的通过切片转为数字的函数,我们看下

Redis RESP协议如何实现

该函数主要的功能是将其[]byte数字转换为int数据。

如上,我们整个RESP协议功能写完了,我们运行下看下实际效果:

Redis RESP协议如何实现

很显然,我们成功拆解了该数据。

读到这里,这篇“Redis RESP协议如何实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

文章标题:Redis RESP协议如何实现,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24015

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月8日 下午10:52
下一篇 2022年9月8日 下午10:54

相关推荐

  • 怎么在html页面中调用外部样式

    两种调用方法:1、使用link标签调用,语法“<link href=”外部样式表文件路径” rel=”stylesheet” type=”text/css” />”;2、利用“@import”关键字调用,语法“&lt…

    2022年9月16日
    81200
  • git如何删除submodule

    git删除submodule的方法:1、利用“vim .gitmodules”删除Submodule对应的文件;2、利用“vim .git/config”更改git配置文件中的信息,删除掉submodule相关内容;3、将modules目录下的submoudle删除即可。 git删除submodul…

    2022年6月27日
    4.5K00
  • 开源WEB应用防火墙jxwaf怎么用

    jxwaf jxwaf(锦衣盾)是一款基于openresty(nginx+lua)开发的下一代web应用防火墙,独创的业务逻辑防护引擎和机器学习引擎可以有效对业务安全风险进行防护,解决传统WAF无法对业务安全进行防护的痛点。内置的语义分析引擎配合机器学习引擎可以避免传统WAF规则叠加太多导致速度变慢…

    2022年9月24日
    54600
  • php判断数组中指定值是不是最后一个元素

    两种判断方法:1、利用end()函数和“===”运算符,获取数组最后一个元素的值,比较该元素值是否为指定值即可,语法“end($arr===”指定值”)”,如果相等则是,反之则不是。2、利用array_pop()函数和“===”运算符,语法“array_pop($arr===…

    2022年9月16日
    60800
  • Android开发怎么自定义实时图表控件

    今天分享文章“Android开发怎么自定义实时图表控件”,主要从:演示、环境、实现、第十一步:绘制等几个方面为大家介绍,希望能帮到您。 演示 环境 开发工具:Android Studio 开发语言:Kotlin 实现 名列前茅步:新建项目RealTimeChartDemo 第二步:新建RealTim…

    2022年6月29日
    49100
  • 如何进行CaptureFramework框架分析

    一、背景 应用服务监控是智能运维系统的重要组成部分。在UAV系统中,中间件增强框架(MOF)探针提供了应用画像及性能数据收集等功能,其中数据收集功能主要采集四类数据:实时数据、画像数据、调用链接数据生成以及线程数据分析数据。为实现实时数据采集,UAVStack设计了CaptureFramework框…

    2022年9月5日
    50200
  • windows msedge.exe应用程序有什么功能

    “msedge.exe”指的是“Microsoft Edge”网页浏览器软件;“Microsoft Edge”是由Microsoft开发的网页浏览器,该浏览器在2015年被正式命名,并且内置在了Windows10版本中;该浏览器与IE浏览器相比,Edge将支持现代浏览器功能,比如扩展。 本教程操作环…

    2022年9月10日
    1.1K00
  • imazing提示类型初始值设定项引发异常怎么解决

    imazing提示类型初始值设定项引发异常解决方法 1、类型初始值设定项引发异常的问题一般会出现在程序开发运行时,导致程序无法运行。 2、因此如果我们要从根本上解决这个问题需要对程序文件进行编辑操作。 3、但是对于普通人来说,我们不需要进行这么麻烦的操作,只需要重新下载安装软件就可以解决了。 4、立…

    2022年9月16日
    81300
  • redis分片集群如何搭建与使用

    前言 redis可以说在实际项目开发中使用的非常频繁,在redis常用集群中,我们聊到了redis常用的几种集群方案,不同的集群对应着不同的场景,并且详细说明了各种集群的优劣,本篇将以redis 分片集群为切入点,从redis 分片集群的搭建开始,详细说说redis 分片集群相关的技术点; 单点故障…

    2022年9月13日
    1.1K00
  • 销售管理软件

    销售管理软件顾名思义就是专门管理销售人员的软件,这种管理软件在企业中是比较流行的,通过线索的精细化管理、客户分级分层管理、标准化销售流程管理,商机管理,产品价格、促销返利、订单管理、销售预测与数据分析等功能,实现线索到现金的完整业绩闭环,提升销售工作效能,驱动业绩增长,提升客户满意度。 现在无论什么…

    2022年3月24日
    63700
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部