Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment recevoir un message de publication Redis dans Go

Je crois que votre code est très bien; le problème est que vous publiez un message avant que votre abonnement ne soit actif. Par exemple, essayez ceci, qui place votre éditeur dans une goroutine qui publie un message une fois par seconde :

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

}

Exécutez ceci et vous verrez que votre abonné reçoit un message une fois par seconde, produisant une sortie comme :

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