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