使用go net實現(xiàn)簡單的redis通信協(xié)議
?圖解redis通信協(xié)議
請求協(xié)議:
請求協(xié)議一般格式:
*<參數(shù)數(shù)量> CR LF $<參數(shù) 1 的字節(jié)數(shù)量> CR LF <參數(shù) 1 的數(shù)據(jù)> CR LF ... $<參數(shù) N 的字節(jié)數(shù)量> CR LF <參數(shù) N 的數(shù)據(jù)> CR LF
例如,一個登錄命令:
*2 2-> 參數(shù)數(shù)量 $4 4-> 字節(jié)數(shù)量 AUTH $13 password@2018
返回結(jié)果:
+OK
實際上,發(fā)送的命令為“*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])) }
運行結(jié)果
+OK
+OK
*9
$4
set2
$1
s
$4
set3
$7
string3
$4
int1
$4
test
$7
string2
$7
string1
$7
string4
到此這篇關(guān)于使用go net實現(xiàn)簡單的redis通信協(xié)議的文章就介紹到這了,更多相關(guān)go redis通信協(xié)議內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang學(xué)習(xí)筆記(五):函數(shù)
這篇文章主要介紹了Golang學(xué)習(xí)筆記(五):函數(shù)的相關(guān)資料,本文講解了基本語法、多返回值及命名返回參數(shù)、參數(shù)傳遞:傳值與傳指針、參數(shù)傳遞:可變參數(shù)、匿名函數(shù)、函數(shù)作為值、類型等內(nèi)容,需要的朋友可以參考下2015-05-05golang基于websocket通信tcp keepalive研究記錄
這篇文章主要為大家介紹了golang基于websocket通信tcp keepalive研究記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06GoLang之標(biāo)準(zhǔn)庫encoding/json包
本文主要介紹了GoLang之標(biāo)準(zhǔn)庫encoding/json包,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Golang環(huán)境變量設(shè)置和查看工具go env詳解
go env 是 Go 工具鏈中的一個命令,用于設(shè)置和查看當(dāng)前 Golang 環(huán)境的相關(guān)信息,對于理解、編譯和運行 Golang 程序非常有用,本文就給大家簡單的介紹一下Golang環(huán)境變量設(shè)置和查看工具go env,需要的朋友可以參考下2023-07-07Go語言讀取,設(shè)置Cookie及設(shè)置cookie過期方法詳解
這篇文章主要介紹了Go語言讀取,設(shè)置Cookie及設(shè)置cookie過期方法詳解,需要的朋友可以參考下2022-04-04