【问题标题】:Using Redis as a Link Between Docker Containers使用 Redis 作为 Docker 容器之间的链接
【发布时间】:2019-06-09 16:09:26
【问题描述】:

我有一个包含多个容器的 docker-compose 文件,其中两个应该通过 Redis DB 进行通信。两个容器都与 Reids 有连接,我可以从两者中读取/写入。但是,我希望每次从另一个容器添加某些东西时触发一个容器。我以为我可以通过 Redis Sub/Pub 完成此操作,但是当我运行代码时它永远不会触发任何事情,即使我可以看到我已将新项目添加到 Redis 队列中。

由此我有两个问题: 1. 我想做的事是否可能?我可以在两个单独的 docker 容器中发布/订阅并期望它按上述方式工作吗? 2.如果可能的话,有人可以在下面指出我使用此工具的问题吗?

这是我将新数据添加到 Redis 队列,然后将数据发布到 Docker 容器 1 中的功能。

func redisShare(key string, value string) {
jobsQueue.Set(key, value, 0) //setting in the queue
jobsQueue.Publish(key, value) //publishing for the other docker container to notice
fmt.Println("added ", key, "with a value of ", value, "to the redis queue")
}

我在我的另一个 docker 容器中使用这一行来订阅 Redis 队列并监听更改: redisdb.Subscribe()

我希望如果将某些内容添加到 redis 队列中,它会将数据共享到另一个容器,并且我会看到收到的消息,但现在 Docker Container 2 只是运行然后关闭。

谢谢!

【问题讨论】:

  • 您需要订阅频道redisdb.Subscribe(key)
  • 密钥实际上是一个唯一的 ID,每次添加到队列中都是不同的。如果 UID 每次都相同,这仍然有效吗?
  • 我明白了,你想发布设置了key=value的信息,我只写了“key”,因为它是发布的第一个参数。您可能正在寻找这样的东西:jobsQueue.Publish("myKeySetInfoChannel", key + " was set to " + value) => redisDb.Subscribe("myKeySetInfoChannel")
  • 谢谢!我得到了它的工作。

标签: docker go redis


【解决方案1】:

以防万一其他人想知道答案:我最终使用了 Aleksandrs 和 sui 的答案的组合。 在我的第一个 Docker 容器中,我将结果发布到了一个特定的频道:

publishData := redisdb.Subscribe("CHANNELNAME")

然后在我订阅频道的第二个 Docker 容器中,感谢 sui 在这部分的帮助,我订阅了频道并提取了 UID 和 IP 信息,如下所示:

ch := pubsub.Channel()
    for msg := range ch {
        fmt.Println(msg.Payload)
        s := strings.Split(msg.Payload, ":")
        UID, IP := s[0], s[1]
        fmt.Println(UID, IP)
    }

到目前为止,这对我来说非常有用 - 非常感谢 sui 和 Aleksandrs 的帮助!

【讨论】:

    【解决方案2】:

    来自docs

    receiver.go

    package main
    
    import (
        "fmt"
    
        "github.com/go-redis/redis"
    )
    
    func main() {
        c := redis.NewClient(&redis.Options{
            Addr: ":6379",
        })
    
        pubsub := c.Subscribe("mychannel1")
    
        // Wait for confirmation that subscription is created before publishing anything.
        _, err := pubsub.Receive()
        if err != nil {
            panic(err)
        }
    
        // Go channel which receives messages.
        ch := pubsub.Channel()
    
        // Consume messages.
        for msg := range ch {
            fmt.Println(msg.Channel, msg.Payload)
        }
    }
    

    sender.go

    package main
    
    import (
        "time"
    
        "github.com/go-redis/redis"
    )
    
    func main() {
        c := redis.NewClient(&redis.Options{
            Addr: ":6379",
        })
    
        // Publish a message.
        for range time.Tick(time.Second) {
            err := c.Publish("mychannel1", "hello").Err()
            if err != nil {
                panic(err)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多