golang使用redis发布订阅
依赖: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)returncase 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 mainimport (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)returncase redigoRedis.Message:log.Println("redis sub receive message:", n.Channel, string(n.Data))}}}()//订阅test_channelerr = psc.Subscribe(redigoRedis.Args{}.AddFlat("test_channel")...)if err != nil {log.Printf("redis sub channel[%s] error:%s", "test_channel", err)}//取消订阅test_channelerr = 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命令测试效果
客户端执行如下命令:

订阅收到的消息如下:

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
