前言

简单介绍一下客户端的通信协议。

正文

第 一,客户端与服务端之间的通信协议是在TCP协议之上构建的。

第二, Redis制定了RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易 被人类识别。

例如客户端发送一条set hello world命令给服务端,按照RESP 的标准,客户端需要将其封装为如下格式(每行用\r\n分隔):

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

可以看到除了命令(set hello world)和返回结果(OK)本身还包含了 一些特殊字符以及数字,下面将对这些格式进行说明。

  1. 发送命令的格式

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 简单整理——客户端通信协议[十五]的更多相关文章

  1. Redis源代码分析(三十五)--- redis.c服务端的实现分析(2)

    在Redis服务端的代码量真的是比較大,假设一个一个API的学习怎么实现,无疑是一种效率非常低的做法,所以我今天对服务端的实现代码的学习,重在他的运行流程上.而对于他的模块设计在上一篇中我已经分析过了 ...

  2. 【leetcode 简单】 第八十五题 两个数组的交集 II

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...

  3. 【leetcode 简单】 第七十五题 第一个错误的版本

    你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的. 假设你有 n 个版本 [1, ...

  4. 【leetcode 简单】 第六十五题 2的幂

    给定一个整数n,判断它是否为2的次方幂. 方法:2,4,8都是2的n次幂 任何整数乘以2,都相当于向左移动了一位,而2的0次幂为1,所以2的n次幂就是1向左移动n位.这样,2的幂的特征就是二进制表示只 ...

  5. 【leetcode 简单】 第三十五题 环形链表

    给定一个链表,判断链表中是否有环. 进阶: 你能否不使用额外空间解决此题? /** * Definition for singly-linked list. * struct ListNode { * ...

  6. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  7. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

  8. Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例

    前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...

  9. 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4

    孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...

  10. 面试简单整理之Redis

    179.redis 是什么?都有哪些使用场景? Redis是一个key-value存储系统. 缓存,消息队列,排行榜/计数器,分布式架构,做session共享 180.redis 有哪些功能? 181 ...

随机推荐

  1. Codeforces Round 928 (Div. 4)(A、B、C、D、E、G)

    目录 A B C D E G A 统计A.B输出 #include <bits/stdc++.h> #define int long long #define rep(i,a,b) for ...

  2. 最小生成树(二)Prim算法

    一.思想 1.1 基本概念 加权无向图的生成树:一棵含有其所有顶点的无环连通子图. 最小生成树(MST):一棵权值最小(树中所有边的权值之和)的生成树. 1.2 算法原理 1.2.1 切分定理 切分定 ...

  3. 【LLM】大模型落地-从理论到实践

    简述 按个人偏好和目标总结了学习目标和路径(可按需学习),后续将陆续整理出相应学习资料和资源. 学习目标 熟悉主流LLM(Llama, ChatGLM, Qwen)的技术架构和技术细节:有实际应用RA ...

  4. 文件的特殊权限:SUID,SGID,SBIT

    文件的特殊权限:SUID,SGID,SBIT Set UID SUID权限只用于二进制文件 运行者必须有X权限 运行者在程序运行过程(run-time)中具有二进制文件拥有者(owner)的权限 例子 ...

  5. golang 依赖控制反转(IoC) 改进版

    最近在开发基于golang下的cqrs框架 https://github.com/berkaroad/squat (陆续开发中,最近断了半年,懒了...).这个框架依赖ioc框架,因为之前写了一个io ...

  6. 记录mysql order by xxx limit xxx数据重复的问题

    引用 http://vsalw.com/9768.html 记录mysql排序字段有重复值,分页数据错乱问题,下面2个sql 除了分页limit外,其他都一样, 但是第三页的结果却包含部分第二页的数据 ...

  7. Dll堆栈问题(Dll的静态变量与全局变量、vs的MT与MD)

    问题引入:dll有一个导出函数,函数参数是string&,string在函数内部被=赋值.在exe动态加载此dll,调用此导出函数后,会崩溃. 原因:如果任何STL类的实现中使用了静态变量(我 ...

  8. 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第7章

    本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录

  9. [MySQL]细节、经验

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/129922615 出自[进步* ...

  10. .NET分布式Orleans - 3 - Grain放置

    在Orleans 7中,Grain放置是指确定将Grain对象放置在Orleans集群中的哪些物理节点上的过程. Grain是Orleans中的基本单位,代表应用程序中的逻辑单元或实体.Grain放置 ...