3 回答
TA贡献1831条经验 获得超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条经验 获得超3个赞
我不知道如果这是正确的方法,但在创建新的 Redis 客户端时,将ReadTimeout属性设置为-1解决了我的问题。
redisClient := redis.NewClient(&redis.Options{
Addr: addr,
Password: redisConf.Password,
DB: 0, // Default DB
ReadTimeout: -1,
})
注意:我使用的是 go-redis/v9
TA贡献1877条经验 获得超1个赞
我的看法是,如果 Redis 认为客户端空闲,它可能会断开你的客户端的连接。
解决这个问题的方法似乎是这样的:
使用
ReceiveTimeout
而不是Receive
.如果操作超时,则发出
Ping
并等待回复。冲洗,重复。
这样,您就可以确保连接上存在一些流量,无论是否实际发布了任何数据。
- 3 回答
- 0 关注
- 356 浏览
添加回答
举报