使用go net实现简单的redis通信协议

作者:luslin1711 时间:2024-05-29 22:06:25 

?图解redis通信协议

使用go net实现简单的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,通信协议
0
投稿

猜你喜欢

  • 使用Python中的greenlet包实现并发编程的入门教程

    2023-10-18 08:29:00
  • Vue之插件详解

    2024-04-30 10:44:57
  • 纯Javascript实现Windows 8 Metro风格实现

    2024-04-19 10:41:31
  • Mysql官方性能测试工具mysqlslap的使用简介

    2024-01-23 18:38:46
  • 一个超级简单的python web程序

    2021-11-19 18:05:06
  • 如何利用Fiddler模拟恶劣网络环境

    2022-04-12 02:22:51
  • mysql delete 多表连接删除功能

    2024-01-21 15:02:41
  • Python面向对象class类属性及子类用法分析

    2021-07-22 03:04:46
  • python 实时得到cpu和内存的使用情况方法

    2023-10-05 20:03:24
  • 如何调试 XMLHttpRequest

    2008-08-15 13:59:00
  • 在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
  • Python+OpenCV 实现简单的高斯滤波(推荐)

    2021-07-18 20:31:26
  • FP-growth算法发现频繁项集——构建FP树

    2022-04-26 16:22:52
  • 指导:SQL Server无日志恢复数据库

    2009-02-20 17:07:00
  • python利用smtplib实现QQ邮箱发送邮件

    2023-07-15 18:47:12
  • asp之家 网络编程 m.aspxhome.com