Redis竟然还有自定义网络通信协议?

共 1337字,需浏览 3分钟

 ·

2021-03-06 03:39


  点击上方“JavaEdge”,关注公众号

设为“星标”,好文章不错过!


凡是网络通信,皆需要双方遵守一致的协议才能互联。Redis协议在如下几点之间做出了折衷:

  • 实现简单

  • 被计算机快速解析

  • 有一定的可读性

网络层



Redis在TCP端口6379上监听到来的连接,客户端连接到来时,Redis服务器为此创建一个TCP连接。在客户端与服务器端之间传输的每个Redis命令或者数据都以\r\n结尾。


请求


Redis接收由不同参数组成的命令。一旦收到命令,将会立刻被处理,并响应给客户端。




新的统一请求协议


新的统一协议在Redis 1.2中引入,在Redis 2.0中,成为与Redis服务器通讯的标准方式。

在这个统一协议里,发送给Redis服务端的所有参数都是二进制安全的。

如下是通用形式:

*<number of arguments> CR LF$<number of bytes of argument 1> CR LF<argument data> CR LF...$<number of bytes of argument N> CR LF<argument data> CR LF


示例:

➜  ~ nc localhost 6379keys **2$18user:sign:5:202101$18seckill_vouchers:6


上面的命令看上去像是单引号字符串,所以可在查询中看到每个字节的准确值:

"*2\r\n$18\r\nuser:sign:5:202101\r\n$18\r\nseckill_vouchers:6\r\n"


在Redis的响应中也使用这样的格式。批量回复时,这种格式用于每个参数。实际的统一请求协议是Redis用于返回列表项,并调用 Multi-bulk回复。仅仅是N个以以*\r\n为前缀的不同批量回复,是紧随的参数(批量回复)数目。


响应


Redis用不同的响应类型回复命令。它可能从服务器发送的第一个字节开始校验回复类型:



单行响应


响应的第一个字节将是+

set java edge+OK




错误消息


响应的第一个字节是-

keys*-ERR unknown command `keys*`, with args beginning with:




整型数字


响应的第一个字节将是:




批量响应



第一个字节将是$

keys **2$18user:sign:5:202101$18seckill_vouchers:6




多个批量响应


响应的第一个字节将是*



往期推荐


由于不知线程池的bug,某Java程序员叕被祭天

程序员因重复记录日志撑爆ELK被辞退!

拥抱Kubernetes,再见了Spring Cloud

JDK为何自己先破坏双亲委派模型?




目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群


喜欢文章,点个“在看、点赞、分享”素质三连支持一下~

浏览 31
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报