介绍RESP协议
- 之前学习的主要是各种redis的基本操作/命令,都是在redis命令行客户端,手动执行的,更多的时候,是使用redis的api,来实现定制化的redis客户端程序,进一步操作redis服务器
- 联想到之前学习过的JDBC/MyBatis可以实现,redis提供的命令行客户端/第三方的图形化客户端,它们本质上都属于是”通用的客户端程序“,相比之下,我们更希望用到”专用的“,”定制化“的客户端程序,redis命令相当于使用代码来执行
- 为什么我们能编写出一个自定义的redis客户端,那咱们能不能编写出一个qq的自定义客户端/王者农药的自定义客户端/xxxx自定义客户端
网络协议:
应用层:虽然业界有很多成熟的应用层协议:HTTP协议等,但是此处更多的时候,都会”自定义“应用层协议,Redis此处应用层协议,就是自定义的协议,传输层还是基于TCP(客户端按照这里的应用层协议发送请求,服务器按照这个协议进行解析,再按照这个协议构造响应,客户端再介意这个响应)咱们作为第三方,要想开发一个redis客户端也就需要知道redis的应用层协议
- 之所以上述通信能够完成,是因为开发客户端的人和开发服务器的人都清楚的知道协议的细节
- 以下协议是固定好的,是在系统内核或者驱动程序中实现的,只能选择,不能修改
传输层:TCP/UDp协议 | 网络层:IP协议 | 数据链路层:以太网 | 物理层
Redis自定义的应用层协议的名字-RESP
不能编写自定义的qq/王者农药客户端,因为他们并没有公开协议的,但是网上还是有一些自定义的qq自定义的客户端啊?这是因为通过一些抓包/逆向手段,猜测qq的应用层协议是啥样的,猜多猜少靠水平+运气了
RESP优点:
- 简单好实现
- 快速进行协议
- 肉眼可读
传输层基于TCP,但是和TCP又没有强耦合,请求和响应之间的通信模型是一问一答的形式,客户端给服务器发一个请求,服务器给客户端返回一个响应
RESP协议的描述:
客户端给服务器发送的是redis命令(bulk string),不同的命令返回结果不一样,有的命令返回OK,有的命令返回整数,有的返回个数组,交代了请求和响应的格式
RESP协议的具体数据格式符号
如果是+,则是简单字符串
服务器就把这个字符串,写入到tcp socket中即可,simple string只能当作简单文本
服务器也把这个字符串也写到tcp socket中
服务器把整数写到tcp socket中
服务器把bulk string写到tcp socket中,可以传输二进制数据
因此,redis客户端服务器要做的工作
- 按照上述格式,构造出字符串,往socket中写入
- 从socket中读取字符串,按照上述格式解析
Question:那么写代码要按照上述的协议,解析/构造字符串嘛?
Answer:不用,因为这套协议,公开已久,已经有很多大佬实现了这套协议的解析构造,这些大佬提供的库,就可以比较简单方便的来完成和redis服务器通信的操作了