如何在Golang for Redis(redigo)Pubsub中编写更好的Receive()?

如何在Golang for Redis(redigo)Pubsub中编写更好的Receive()?,go,redis,publish-subscribe,redigo,Go,Redis,Publish Subscribe,Redigo,在上面的代码(取自)中,如果连接丢失,所有订阅也将丢失。从丢失的连接中恢复并重新订阅的更好方法是什么。使用两个嵌套循环。外部循环获取连接,设置订阅,然后调用内部循环来接收消息。内部循环执行,直到连接上出现永久性错误 psc := redis.PubSubConn{c} psc.Subscribe("example") func Receive() { for { switch v := psc.Receive().(type) { case redis.

在上面的代码(取自)中,如果连接丢失,所有订阅也将丢失。从丢失的连接中恢复并重新订阅的更好方法是什么。

使用两个嵌套循环。外部循环获取连接,设置订阅,然后调用内部循环来接收消息。内部循环执行,直到连接上出现永久性错误

psc := redis.PubSubConn{c}
psc.Subscribe("example")

func Receive() {
    for {
        switch v := psc.Receive().(type) {
        case redis.Message:
            fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
        case redis.Subscription:
            fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
        case error:
            return v
        }
    }
}
此示例使用Redigo获取连接。另一种方法是直接拨号连接:

for {
    // Get a connection from a pool
    c := pool.Get()
    psc := redis.PubSubConn{c}

    // Set up subscriptions
    psc.Subscribe("example"))

    // While not a permanent error on the connection.
    for c.Err() == nil {
        switch v := psc.Receive().(type) {
        case redis.Message:
            fmt.Printf("%s: message: %s\n", v.Channel, v.Data)
        case redis.Subscription:
            fmt.Printf("%s: %s %d\n", v.Channel, v.Kind, v.Count)
        case error:
            fmt.Printf(err)
        }
    }
    c.Close()
}

创建一个
拨号
函数同时订阅相应频道的系统怎么样。@tim cooper非常干净+1 Tim Cooper在评论中的解决方案更为简洁。拨号在重新连接期间负责订阅。谢谢+1@aloksrivastava78Subscribe from dial可防止在应用程序中将池用于其他目的,使订阅代码远离接收代码,并且不允许使用redigo文档。
 c, err := redis.Dial("tcp", serverAddress)