亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 redis-benchmark 命令不遵循 redis 協議?

為什么 redis-benchmark 命令不遵循 redis 協議?

Go
收到一只叮咚 2021-08-10 10:40:15
運行redis-benchmark命令后,我直接從 tcp 連接讀入,據我所知,redis-benchmark沒有遵循 redis 協議。在Redis的協議是在其網站上的聲明:RESP 在 Redis 中用作請求-響應協議的方式如下:客戶端將命令作為批量字符串的 RESP 數組發送到 Redis 服務器。服務器根據命令實現以其中一種 RESP 類型進行回復。這意味著正確的客戶端實現必須始終發送批量字符串的 RESP 數組。如果這是真的,那么任何不以 * 開頭的都被視為語法錯誤(因為它不是 RESP 數組)。因此,如果要向 redis-server 發送 ping 命令,則必須將其作為長度為 1 的 resp 數組發送,其中包含 1 個包含單詞 ping 的批量字符串。例如:"*1\r\n$4\r\nPING\r\n"但是,每當我直接收聽 redis-benchmark 命令并讀取其 tcp 連接時,我都會得到:"PING\r\n"這不會不遵循redis的協議。這是一個錯誤還是 redis 協議中隱含的某些東西使 ping 變得特別?據我所知,我找不到任何說 ping 很特殊的東西,也找不到任何長度為 1 的命令是特殊的。有人知道這是怎么回事嗎?要自己查看重現這些結果,您可以復制我的代碼以直接檢查它:package mainimport (    "fmt"    "log"    "net")func main() {    RedisBenchmark()}func RedisBenchmark() {    url := "127.0.0.1:6379"    fmt.Println("listen: ", url)    ln, err := net.Listen("tcp", url) //announces on local network    if err != nil {        log.Fatal(err)    }    for {        conn, err := ln.Accept() //waits and returns the next connection to the listener        if err != nil {            log.Fatal(err)        }        tcpConn := conn.(*net.TCPConn)        go HandleConnection(tcpConn)    }}func HandleConnection(tcpConn *net.TCPConn) {    b := make([]byte, 256) //TODO how much should I read at a time?    n, err := tcpConn.Read(b)    if err != nil {        fmt.Println("n: ", n)        log.Fatal(err)    }    fmt.Printf("+++++> raw input string(b): %q\n", string(b))    msg := string(b[:n])    fmt.Printf("+++++> raw input msg: %q\n", msg)}并使用 go 運行它:go run main.go在不同的終端(或 tmux 窗格)上跟隨:redis-benchmark對于所有測試,或者如果您只想使用 1 個客戶端運行 ping:redis-benchmark -c 1 -t ping -n 1您可以在以下位置查看有關我如何使用標志運行它的詳細信息:http : //redis.io/topics/benchmarks
查看完整描述

2 回答

?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

這稱為內聯命令。查看Redis 協議文章的內聯命令部分。


查看完整回答
反對 回復 2021-08-10
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

您可以參考源代碼找出 inline command 和RESP之間的區別。


readQueryFromClient

|-->  if command begins with * --> processInlineBuffer()process it as RESP

|

|-->  if command not begins with * --> processMultibulkBuffer():process it as inline command 

RESP是一種更有效的方式來解析 Redis 服務器的命令


查看完整回答
反對 回復 2021-08-10
  • 2 回答
  • 0 關注
  • 287 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號