使用bufio.Scanner
fmt.Fprintf(conn, "*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nHello!!\r\n")
scanner := bufio.NewScanner(conn)
for {
// fmt.Println("marker00")
if ok := scanner.Scan(); !ok {
// fmt.Println("marker01")
break
}
// fmt.Println("marker02")
fmt.Println(scanner.Text())
}
“+ OK”作为第一次扫描的结果,但第二次扫描仅在调用Scan
方法时停止。 (marker00 - > marker02 - > marker00,不再输出)
为什么Scan
会停止,如何知道TCP响应的结束(不使用bufio.Reader
)?
答案 0 :(得分:4)
发送命令后,Redis不会为您关闭连接。扫描()在未发送的io.EOF之后结束。
看看这个:
package main
import (
"bufio"
"fmt"
"net"
)
// before go run, you must hit `redis-server` to wake redis up
func main() {
conn, _ := net.Dial("tcp", "localhost:6379")
message := "*3\r\n$3\r\nSET\r\n$1\r\na\r\n$1\r\nb\r\n"
go func(conn net.Conn) {
for i := 0; i < 10; i++ {
fmt.Fprintf(conn, message)
}
}(conn)
scanner := bufio.NewScanner(conn)
for {
if ok := scanner.Scan(); !ok {
break
}
fmt.Println(scanner.Text())
}
fmt.Println("Scanning ended")
}
答案 1 :(得分:0)
老问题,但是我有同样的问题。两种解决方案:
1)在您的Redis消息中添加“ QUIT \ r \ n”命令。这将导致Redis关闭连接,这将终止扫描。您必须处理退出输出的额外“ + OK”。
2)添加
conn.SetReadDeadline(time.Now().Add(time.Second*5))
就在您开始扫描之前。这将导致扫描在5秒钟后停止尝试。不幸的是,完成扫描总是需要5秒钟,因此请明智地选择此时间。