redis 简单整理——客户端通信协议[十五]
前言
简单介绍一下客户端的通信协议。
正文
第 一,客户端与服务端之间的通信协议是在TCP协议之上构建的。
第二, Redis制定了RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易 被人类识别。
例如客户端发送一条set hello world命令给服务端,按照RESP 的标准,客户端需要将其封装为如下格式(每行用\r\n分隔):

这样Redis服务端能够按照RESP将其解析为set hello world命令,执行后 回复的格式如下:

可以看到除了命令(set hello world)和返回结果(OK)本身还包含了 一些特殊字符以及数字,下面将对这些格式进行说明。
- 发送命令的格式
RESP的规定一条命令的格式如下,CRLF代表"\r\n"。
*<参数数量> CRLF
$<参数1的字节数量> CRLF
<参数1>
CRLF ...
$<参数N的字节数量> CRLF
<参数N> CRLF
参数数量为3个,因此第一行为:
*3
参数字节数分别是355,因此后面几行为:
$3
SET
$5
hello
$5
world
有一点要注意的是,上面只是格式化显示的结果,实际传输格式为如下代码:
*3\r\n$3\r\nSET\r\n$5\r\nhello\r\n$5\r\nworld\r\n
返回格式:
Redis的返回结果类型分为以下五种
·状态回复:在RESP中第一个字节为"+"。
·错误回复:在RESP中第一个字节为"-"。
·整数回复:在RESP中第一个字节为":"。
·字符串回复:在RESP中第一个字节为"$"。
·多条字符串回复:在RESP中第一个字节为"*"。
static sds cliFormatReplyTTY(redisReply *r, char *prefix)
{ sds out = sdsempty();
switch (r->type)
{
case REDIS_REPLY_ERROR:
// 处理错误回复
case REDIS_REPLY_STATUS:
// 处理状态回复
case REDIS_REPLY_INTEGER:
// 处理整数回复
case REDIS_REPLY_STRING:
// 处理字符串回复
case REDIS_REPLY_NIL:
// 处理空
case REDIS_REPLY_ARRAY:
// 处理多条字符串回复
return out;
}
那么直接用telnet和nc分别实现一下啊,直接弄用协议写一下。



后面几个可以自己玩一下。
有一点需要注意,无论是字符串回复还是多条字符串回复,如果有nil 值,那么会返回$-1。

有了RESP提供的发送命令和返回结果的协议格式,各种编程语言就可 以利用其来实现相应的Redis客户端,后面两节将介绍Java和Python两个编程 语言的Redis客户端。
结
下一节Java客户端Jedis。
redis 简单整理——客户端通信协议[十五]的更多相关文章
- Redis源代码分析(三十五)--- redis.c服务端的实现分析(2)
在Redis服务端的代码量真的是比較大,假设一个一个API的学习怎么实现,无疑是一种效率非常低的做法,所以我今天对服务端的实现代码的学习,重在他的运行流程上.而对于他的模块设计在上一篇中我已经分析过了 ...
- 【leetcode 简单】 第八十五题 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...
- 【leetcode 简单】 第七十五题 第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...
- 【leetcode 简单】 第六十五题 2的幂
给定一个整数n,判断它是否为2的次方幂. 方法:2,4,8都是2的n次幂 任何整数乘以2,都相当于向左移动了一位,而2的0次幂为1,所以2的n次幂就是1向左移动n位.这样,2的幂的特征就是二进制表示只 ...
- 【leetcode 简单】 第三十五题 环形链表
给定一个链表,判断链表中是否有环. 进阶: 你能否不使用额外空间解决此题? /** * Definition for singly-linked list. * struct ListNode { * ...
- Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...
- [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...
- Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例
前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...
- 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4
孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...
- 面试简单整理之Redis
179.redis 是什么?都有哪些使用场景? Redis是一个key-value存储系统. 缓存,消息队列,排行榜/计数器,分布式架构,做session共享 180.redis 有哪些功能? 181 ...
随机推荐
- .NET集成DeveloperSharp实现数据分页
数据分页,几乎是任何应用系统的必备功能.但当数据量较大时,分页操作的效率就会变得很低.大数据量分页时,一个操作耗时5秒.10秒.甚至更长时间都是有可能的,但这在用户使用的角度是不可接受的-- 数据分页 ...
- 内部UI自动化测试培训之python基础
这个文档的由来是公司内部UI自动化测试培训的资料.部门为了减少测试工作量,准备做UI自动化测试.我写python,其他同事都是java,所以python基础和UI自动化测试selenium的培训就由我 ...
- pdf 等所有文件通过blog强制下载函数 downloadFileFromBlobByToken
downloadFileFromBlobByToken pdf 等所有文件通过blog强制下载函数 downloadFileFromBlobByToken import { getToken } fr ...
- https://pengchenggang.github.io/vuejsdev-com-github 备份发布
https://pengchenggang.github.io/vuejsdev-com-github 备份发布 现在还没有解决的就是 开clash,代码提交不上去,只能关了提,但是关了提交,也得赶运 ...
- npm pack - npm install .tgz 离线安装 前端开发环境
npm pack - npm install .tgz 离线安装 前端开发环境 为什么有这个需求 曾经出差,到一个机构里面,里面是局域网,没有外网.后台都是java,刻录个光盘,然后就把开发环境装好了 ...
- pod的拉取和重启策略
在Kubernetes中,Pod的拉取策略和重启策略可以通过YAML配置文件来定义. Pod的拉取策略 Pod的拉取策略指的是Kubernetes在创建或重启Pod时,如何获取Pod所需的容器镜像.这 ...
- Windows10 Linux 子系统的骚操作之 Ctrl+Alt+T shell启动终端
巨硬的 WSL(Windows Subsystem for Linux)是真的好用 但是,由于本人比较喜欢按快捷键.所以一直想着找到Windows上安装的ubuntu.exe文件,搞个快捷方式,然后再 ...
- kettle教程--通过配置文件同步所需要的列数据
kettle教程--通过配置文件同步所需要的列数据 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「kettle」, 免费领取全网最热的kettle实战视频教程 ht ...
- Android IjkPlayer解决RTSP延时300ms左右
简介 在上一篇<ijkplayer编译-RTSP>中介绍了,ijkplayer如何进行编译成so库的,以及如何开启rtsp.那么实际在使用的时候会发现延迟不是一般的大. 现在来介绍一下如何 ...
- ModuleNotFoundError: No module named xxx 的原因和解决办法(附带新大陆)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...