使用Redis作为Docker容器之间的链接

时间:2019-01-15 15:54:10

标签: docker go redis

我有一个包含多个容器的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才运行,然后关闭。

谢谢!

2 个答案:

答案 0 :(得分:0)

以防万一其他人对答案感到疑惑:我最终还是同时使用了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的帮助!

答案 1 :(得分:-1)

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)
        }
    }
}