我们为什么需要了解RESP协议?
RESP
RedisRESP
TCP8888redis-cli -p 8888
redis-cli -p 8888
redis
*1
$7
COMMAND
RESPRedisRESP
什么是RESP协议
RESPRedisRedis 1.2Redis 2.0Redis
- 实现简单
- 快速解析
- 直接可阅读
RESPRESP
RESP协议规范
RESP\r\n
类型 | 前缀 | 备注 |
---|---|---|
简单字符串 | + | 简单字符串以+开头 |
错误数据 | - | 错误数据以-开头 |
整数 | : | 整数以:开头 |
复杂字符串 | $ | 复杂字符串以$开头 |
数组 | * | 数组以*开头 |
我当初看到这个的时候,也是迷迷糊糊的,到底什么意思呢? 哎,我们举个例子你就明白了。
若我们想执行
RESP
*3$3set$10juejinName$5pdudo
我们结合上述信息,可以画一张图。
这就是协议的内容了。
+-:
例如:
+
-
:
Redis
RESPtelnet
RESPredis
命令
RESP
telnet
现在回头看看官网文档所提及的,该协议实现简单,直接可阅读,是不是理解的更加深刻了呢?
使用go编写Redis中间件实现读写分离
本篇暂不解释代码,而后单独开一篇谈论中间件代码。
实现该功能,其实本质上是区分命令是查询还是写入,若是查询,则直接转发到从库,而写入,则转发到主库即可,其架构图可以理解为如下:
我们已经有了目前的架构。
主机 | 端口 | 密码 | 角色 |
---|---|---|---|
127.0.0.1 | 6379 | 无 | 主库 |
127.0.0.1 | 7380 | 无 | 从库 |
相关代码已经放到了 gitee.com/pdudo/golea…
我们来看看实际效果呢:
总结
RESPgoRESPRESP
怎么样,好玩吧,动动你的小手指,快来试试吧。