依赖:github.com/gomodule/redigo/redis
redis发布订阅常用函数:
- Subscribe - 订阅channel
- PSubscribe - 订阅channel支持通配符匹配
- Publish - 将信息发送到指定的channel。
- PubSubChannels - 查询活跃的channel
- PubSubNumSub - 查询指定的channel有多少个订阅者
首先需要实例化一个redis连接
import redigoRedis "github.com/gomodule/redigo/redis"
func main() {
client, err := redigoRedis.Dial("tcp","localhost:6379",
redigoRedis.DialPassword(""),
redigoRedis.DialDatabase(0))
if err != nil {
return
}
}
封装一个订阅者循环消费的代码
psc := redigoRedis.PubSubConn{Conn: client}
go func() {
for {
switch n := psc.Receive().(type) {
case error:
log.Println("redis sub receive error:", n)
return
case redigoRedis.Message:
log.Println("redis sub receive message:", n.Channel, string(n.Data))
}
}
}()
订阅(测试订阅:test_channel)
psc := redigoRedis.PubSubConn{Conn: client}
err = psc.Subscribe(redigoRedis.Args{}.AddFlat("test_channel")...)
if err != nil {
log.Printf("redis sub channel[%s] error:%s", "test_channel", err)
}
取消订阅
psc := redigoRedis.PubSubConn{Conn: client}
err = psc.Unsubscribe(redigoRedis.Args{}.AddFlat("test_channel")...)
if err != nil {
log.Printf("redis unsub channel[%s] error:%s", "test_channel", err)
}
完整代码如下
package main
import (
redigoRedis "github.com/gomodule/redigo/redis"
"log"
"time"
)
func main() {
//初始化连接
client, err := redigoRedis.Dial("tcp", "localhost:6379",
redigoRedis.DialPassword(""),
redigoRedis.DialDatabase(0))
if err != nil {
return
}
defer client.Close()
//构造订阅者连接
psc := redigoRedis.PubSubConn{Conn: client}
go func() {
for {
switch n := psc.Receive().(type) {
case error:
log.Println("redis sub receive error:", n)
return
case redigoRedis.Message:
log.Println("redis sub receive message:", n.Channel, string(n.Data))
}
}
}()
//订阅test_channel
err = psc.Subscribe(redigoRedis.Args{}.AddFlat("test_channel")...)
if err != nil {
log.Printf("redis sub channel[%s] error:%s", "test_channel", err)
}
//取消订阅test_channel
err = psc.Unsubscribe(redigoRedis.Args{}.AddFlat("test_channel")...)
if err != nil {
log.Printf("redis unsub channel[%s] error:%s", "test_channel", err)
}
time.Sleep(time.Hour)
}
使用客户端连接redis,用publish命令测试效果
客户端执行如下命令:
订阅收到的消息如下: