Redis RESP协议实现实例详解


推荐学习:redis视频教程

回顾RESP协议

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

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

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

*3
$3
set
$4
name
$5
pdudo

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

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

例子1

set name pdudo

例子2

lpush pdudo data1
lpush pdudo data2
lrange pdudo 0 -1

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

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

如何拆解RESP协议

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

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

协议什么时候结束

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

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

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

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

如何拆解RESP协议

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

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

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长度的数据即可,这里主要要处理一下\r\n

一览妙笔 一览妙笔

自媒体、编剧、营销人员写作工具

一览妙笔 50 查看详情 一览妙笔

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

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

功能实现

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

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

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

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

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

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

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

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

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

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

这篇文章,我们介绍了应该如何使用go简单的拆解RESP协议的内容,为什么我们不介绍如何编写redis主从中间件呢?

最开始是打算这样写的,但是知识多了,介绍起来会很杂,很难把一个点讲清楚,所以我们就单独挑了一个核心点来介绍,我愿意将其称之为面向核心编程(我的基友很早之前告诉我的),所谓的面向核心编程简而易在就是我们在涉及一个功能的时候,要学会拆解该功能,将核心功能先用demo做出来,而后再慢慢丰富周边,从而完成整个需求涉及。

最后我们再来聊聊RESP协议,官网在介绍时将其概括为实现简单快速解析直接可阅读。如果你认真学习这2篇文章,肯定对此深有感悟。

推荐学习:redis视频教程

以上就是Redis RESP协议实现实例详解的详细内容,更多请关注其它相关文章!


# 将其  # 递归  # 我们可以  # redis  # 舟山抖音营销推广价格  # 常州seo基础入门  # 网站推广都 到a金脉科技放心  # 苏州网站建设定制  # 青岛硅谷网站建设平台  # 靖江seo快排软件  # 辽宁广电网站优化耗材  # 写营销推广方案的目的是  # 河南抖音seo案例  # 养生食品营销推广  # 如果你  # 不包含  # 如何实现  # 网络带宽  # 官网  # 转换为  # 什么时候 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: Lar*el Eloquent:高效删除多对多关系中无关联子记录的父模型  CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式  解决jQuery多计算器输入字段冲突的教程  优化Leaflet弹出层图片显示:条件渲染策略  Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践  iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南  《荔枝fm》导出文件教程  win11怎么启用或禁用休眠 Win11 powercfg命令管理休眠文件【技巧】  CSS如何控制元素外边距_margin实现布局间隔  钉钉任务无法提醒如何处理 钉钉任务提醒优化方法  小米手机截图后如何查看历史_小米手机截图历史记录查看方法  FullCalendar自定义按钮样式定制指南  在XML中嵌入二进制数据(如图片)的最佳实践是什么? Base64编码与解析注意事项  百度网盘如何设置上传限额  咸鱼怎么设置仅粉丝可见的动态_咸鱼动态粉丝可见设置方法  花生壳内网映射新方案  小红书如何引流到私信?引流到私信有用吗?  yy漫画官方网站登录入口_yy漫画在线阅读页面地址  b站如何管理订阅_b站订阅标签分类管理  b站怎么用微信登录_b站微信登录方法  poki官网最新入口 poki小游戏大全入口  QQ网页版官方账号登录入口 QQ网页版网页版入口快速导航  Dagster资产间数据传递与用户配置管理教程  c++如何使用std::thread::join和detach_c++线程生命周期管理  Symfony路由参数转换器:实体存在性验证与错误处理策略  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  教育查询官方网站入口 教育个人档案查询免费官网  Win11如何分屏操作_Win11多窗口分屏技巧  Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析  《豆瓣》私信用户方法  《红果免费短剧》下载观看方法  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  Composer reinstall命令重装损坏的包  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  PHP 4 函数中引用参数的默认值限制与解决方案  Yandex无需登录畅游 俄罗斯搜索引擎最新官网指南  《百度畅听版》关闭兴趣推荐方法  晓晓优选app支付宝绑定方法  暴风影音官网正式版_暴风影音手机版官网下载安卓  Win10如何关闭操作中心通知 Win10免打扰设置全攻略【清爽】  XPath动态元素定位:如何精准选择文本内容变化的元素  自定义你的VS Code状态栏,监控关键信息  优化Asyncio嵌套函数调度:使用生产者-消费者模式实现并发流处理  苹果手机如何清理系统缓存数据 iPhone非越狱清理垃圾文件的技巧【系统优化】  解决CSS background 属性中 cover 关键字的常见误用  Linux如何开发轻量级数据服务模块_Linux服务化设计  PPT智能排版生成入口 免费PPT内容自动生成平台  C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用  ExcelSCAN与LAMBDA如何创建自定义移动平均函数_SCAN实现任意窗口期移动平均计算  《环球网校》设置报考省市方法 

 2022-09-06

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.