为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 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 关注
  • 250 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信