如何在 Go 中接收 Redis 发布消息

我正在尝试在Go中使用Redis PubSub,以便能够传递/发布消息并在订阅期间检索它。


我已经能够正确设置代码的发布和订阅/ PubSub部分。以下是我的代码。我希望在订阅期间检索的(字符串)消息是 但是,我的代码的输出给出了通道,种类和计数,并且不显示预期的消息()。test message.test message


使用 Redis 在 Go 中发布/订阅发布后,如何获取预期的消息(测试消息)?我觉得我很亲近,但我可能在这里错过了一件小事。我对雷迪斯很陌生。感谢您的帮助。


以下是我的代码:


package main


import (

    "fmt"

    "log"

    "time"


    "github.com/gomodule/redigo/redis"

)


func main() {

    fmt.Println("Start redis test.")


    c, err := redis.Dial("tcp", "localhost:6379")

    if err != nil {

        log.Println(err)

    } else {

        log.Println("No error during redis.Dial.")

    }

    // defer c.Close()




    /// Publisher.

    c.Do("PUBLISH", "example", "test message")

    /// End here


    /// Subscriber.

    psc := redis.PubSubConn{Conn: c}

    psc.Subscribe("example")

    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:

            fmt.Println(v)

        }

    }

    /// End here


}

以下是我的输出:example: subscribe 1


绝地无双
浏览 135回答 1
1回答

斯蒂芬大帝

我相信你的代码很好;问题是您在订阅处于活动状态之前发布消息。例如,试试这个,它把你的发布者放到一个每秒发布一条消息的 goroutine 中:package mainimport (    "fmt"    "log"    "time"    "github.com/gomodule/redigo/redis")func main() {    fmt.Println("Start redis test.")    c, err := redis.Dial("tcp", "localhost:6379")    if err != nil {        log.Println(err)    } else {        log.Println("No error during redis.Dial.")    }    // defer c.Close()    /// Publisher.    go func() {        c, err := redis.Dial("tcp", "localhost:6379")        if err != nil {            panic(err)        }        count := 0        for {            c.Do("PUBLISH", "example",                fmt.Sprintf("test message %d", count))            count++            time.Sleep(1 * time.Second)        }    }()    /// End here    /// Subscriber.    psc := redis.PubSubConn{Conn: c}    psc.Subscribe("example")    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:            fmt.Println(v)        }        time.Sleep(1)    }    /// End here}运行此命令,您将看到您的订阅者每秒收到一条消息,产生如下输出:Start redis test.2021/08/18 19:01:29 No error during redis.Dial.example: subscribe 1example: message: test message 0example: message: test message 1example: message: test message 2example: message: test message 3example: message: test message 4example: message: test message 5
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go