3 回答

TA貢獻1831條經(jīng)驗 獲得超4個贊
pubsub.Channel()我通過遍歷從而不是返回的通道來解決斷開連接Receive()。
這是新代碼:
func listenToControlChannel(client *redis.Client) {
pubsub := client.Subscribe("control")
defer pubsub.Close()
if _, err := pubsub.Receive(); err != nil {
rootLogger.Error("failed to receive from control PubSub", zap.Error(err))
return
}
controlCh := pubsub.Channel()
fmt.Println("start listening on control PubSub")
// Endlessly listen to control channel,
for msg := range controlCh {
cm := ControlMessageEvent{}
payload := []byte(msg.Payload)
if err := json.Unmarshal(payload, &cm); err != nil {
fmt.Printf("failed to parse control message: %s\n", err.Error())
} else if err := handleIncomingEvent(&cm); err != nil {
fmt.Printf("failed to handle control message: %s\n", err.Error())
}
}
}

TA貢獻1803條經(jīng)驗 獲得超3個贊
我不知道如果這是正確的方法,但在創(chuàng)建新的 Redis 客戶端時,將ReadTimeout屬性設(shè)置為-1解決了我的問題。
redisClient := redis.NewClient(&redis.Options{
Addr: addr,
Password: redisConf.Password,
DB: 0, // Default DB
ReadTimeout: -1,
})
注意:我使用的是 go-redis/v9

TA貢獻1877條經(jīng)驗 獲得超1個贊
我的看法是,如果 Redis 認為客戶端空閑,它可能會斷開你的客戶端的連接。
解決這個問題的方法似乎是這樣的:
使用
ReceiveTimeout
而不是Receive
.如果操作超時,則發(fā)出
Ping
并等待回復(fù)。沖洗,重復(fù)。
這樣,您就可以確保連接上存在一些流量,無論是否實際發(fā)布了任何數(shù)據(jù)。
- 3 回答
- 0 關(guān)注
- 509 瀏覽
添加回答
舉報