Redis竟然还有自定义网络通信协议?
2023-03-14 09:43:04 时间
凡是网络通信,皆需要双方遵守一致的协议才能互联。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 6379
- keys *
- *2
- $18
- user:sign:5:202101
- $18
- seckill_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
- $18
- user:sign:5:202101
- $18
- seckill_vouchers:6
多个批量响应
- 响应的第一个字节将是*
相关文章
- Spark的两种核心Shuffle详解
- 6500字全面讲解 Redis 性能优化点!
- Redis挂了,流量把数据库也打挂了,怎么办?
- Node.js Stream 背压 — 消费端数据积压来不及处理会怎么样?
- 一文教你如何用C代码解析一段网络数据包?
- 实现瀑布流布局,就这几行代码?
- 换一种存储方式,居然能节约这么多内存?
- Element 穿梭框性能优化
- 从“图片预加载”认识代理设计模式
- 数据结构:跳跃链表
- 量子计算竞争:一场国家实力和技术路线的双重对抗
- 如何实现Vuex的热更新
- 一文讲明白从0到1亿用户的架构设计
- 一篇带你了解Redis删除策略
- CSS 布局的本质是什么
- GaussDB Hash表分布列选择原则及数据倾斜检测
- NumPy 索引和切片的用法总结
- 如何使用Kafka Connect创建用于处理实时数据的开源数据管道?
- 你的业务代码,是不是都写在了Activity里?
- 两大步骤,29行代码学会数据清洗