使用go net实现简单的redis通信协议
作者:luslin1711 时间:2024-05-29 22:06:25
?图解redis通信协议
请求协议:
请求协议一般格式:
*<参数数量> CR LF
$<参数 1 的字节数量> CR LF
<参数 1 的数据> CR LF
...
$<参数 N 的字节数量> CR LF
<参数 N 的数据> CR LF
例如,一个登录命令:
*2 2-> 参数数量
$4 4-> 字节数量
AUTH
$13
password@2018
返回结果:
+OK
实际上,发送的命令为“*2\r\n$4\r\nAUTH\r\n$13\r\npassword@2018\r\n”
测试代码:
package main
import (
"bufio"
"fmt"
"net"
"strconv"
"testing"
"time"
)
type Conn struct {
// Shared
conn net.Conn
// Read
br *bufio.Reader
// Write
bw *bufio.Writer
}
func (c *Conn) Write(cmd string, args ...string) error {
_, err := c.bw.WriteString("*" + strconv.Itoa(1 + len(args)) + "\r\n")
if err != nil {
return err
}
_, err =c.bw.WriteString("$" + strconv.Itoa(len(cmd)) + "\r\n" + cmd + "\r\n")
if err != nil {
return err
}
for _, v := range args {
_, err :=c.bw.WriteString("$" + strconv.Itoa(len(v)) + "\r\n" + v + "\r\n")
if err != nil {
return err
}
}
err = c.bw.Flush()
if err != nil {
return err
}
return nil
}
func TestDail(t *testing.T) {
conn,err := net.Dial("tcp","127.0.0.1:6379")
if err != nil {
panic(err)
}
var c = &Conn{
conn: conn,
br : bufio.NewReader(conn),
bw: bufio.NewWriter(conn),
}
err = c.Write("AUTH","password@2018")
if err != nil {
panic(err)
}
p, err := c.br.ReadSlice('\n')
if err != nil {
panic(err)
}
fmt.Println(string(p))
err = c.Write("SELECT", "5")
if err != nil {
panic(err)
}
p, err = c.br.ReadSlice('\n')
if err != nil {
panic(err)
}
fmt.Println(string(p))
err = c.Write("keys","*")
if err != nil {
panic(err)
}
buffer := make([]byte, 4096)
n, err := c.br.Read(buffer)
if err != nil {
panic(err)
}
fmt.Println(string(buffer[:n]))
}
运行结果
+OK
+OK
*9
$4
set2
$1
s
$4
set3
$7
string3
$4
int1
$4
test
$7
string2
$7
string1
$7
string4
来源:https://blog.csdn.net/luslin1711/article/details/106095061
标签:go,redis,通信协议
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
使用Python中的greenlet包实现并发编程的入门教程
2023-10-18 08:29:00
Vue之插件详解
2024-04-30 10:44:57
![](https://img.aspxhome.com/file/2023/7/130057_0s.jpg)
纯Javascript实现Windows 8 Metro风格实现
2024-04-19 10:41:31
![](https://img.aspxhome.com/file/2023/8/135818_0s.gif)
Mysql官方性能测试工具mysqlslap的使用简介
2024-01-23 18:38:46
一个超级简单的python web程序
2021-11-19 18:05:06
如何利用Fiddler模拟恶劣网络环境
2022-04-12 02:22:51
![](https://img.aspxhome.com/file/2023/6/131896_0s.png)
mysql delete 多表连接删除功能
2024-01-21 15:02:41
Python面向对象class类属性及子类用法分析
2021-07-22 03:04:46
python 实时得到cpu和内存的使用情况方法
2023-10-05 20:03:24
![](https://img.aspxhome.com/file/2023/1/86341_0s.jpg)
如何调试 XMLHttpRequest
2008-08-15 13:59:00
![](https://img.aspxhome.com/file/UploadPic/20088/15/200881514315131s.gif)
在keras 中获取张量 tensor 的维度大小实例
2023-08-27 21:58:12
python递归全排列实现方法
2021-11-17 15:16:04
Asp+Sql 对数据库的各种操作
2007-09-22 10:38:00
PHP获取二叉树镜像的方法
2023-07-13 02:57:39
python实现字符串加密 生成唯一固定长度字符串
2022-02-04 21:02:27
python3利用Dlib19.7实现人脸68个特征点标定
2021-05-05 19:13:06
![](https://img.aspxhome.com/file/2023/4/76034_0s.jpg)
Python+OpenCV 实现简单的高斯滤波(推荐)
2021-07-18 20:31:26
![](https://img.aspxhome.com/file/2023/6/88936_0s.png)
FP-growth算法发现频繁项集——构建FP树
2022-04-26 16:22:52
![](https://img.aspxhome.com/file/2023/1/133541_0s.png)
指导:SQL Server无日志恢复数据库
2009-02-20 17:07:00
python利用smtplib实现QQ邮箱发送邮件
2023-07-15 18:47:12
![](https://img.aspxhome.com/file/2023/6/98986_0s.jpg)