为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
绝地无双 2022-09-26 15:18:52
我正在尝试在Go中使用Redis PubSub,以便能够传递/发布消息并在订阅期间检索它。我已经能够正确设置代码的发布和订阅/ PubSub部分。以下是我的代码。我希望在订阅期间检索的(字符串)消息是 但是,我的代码的输出给出了通道,种类和计数,并且不显示预期的消息()。test message.test message使用 Redis 在 Go 中发布/订阅发布后,如何获取预期的消息(测试消息)?我觉得我很亲近,但我可能在这里错过了一件小事。我对雷迪斯很陌生。感谢您的帮助。以下是我的代码: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.    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
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

我相信你的代码很好;问题是您在订阅处于活动状态之前发布消息。例如,试试这个,它把你的发布者放到一个每秒发布一条消息的 goroutine 中:


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.

    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 1

example: message: test message 0

example: message: test message 1

example: message: test message 2

example: message: test message 3

example: message: test message 4

example: message: test message 5


查看完整回答
反对 回复 2022-09-26
  • 1 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号