golang redis发布订阅
Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者,订阅者和Channel。
发布订阅架构图:
发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个频道的订阅者就能接收到这条消息。Redis的这种发布订阅机制与基于主题的发布订阅类似,Channel相当于主题。
下面介绍golang如何使用redis的发布订阅功能。
go redis发布订阅常用函数:
Subscribe - 订阅channel PSubscribe - 订阅channel支持通配符匹配 Publish - 将信息发送到指定的channel。 PubSubChannels - 查询活跃的channel PubSubNumSub - 查询指定的channel有多少个订阅者
1.Subscribe
订阅channel
例子1:
// 订阅channel1这个channel sub := client.Subscribe("channel1") // 读取channel消息 iface, err := sub.Receive() if err != nil { // handle error } // 检测收到的消息类型 switch iface.(type) { case *redis.Subscription: // 订阅成功 case *redis.Message: // 处理收到的消息 // 这里需要做一下类型转换 m := iface.(redis.Message) // 打印收到的小 fmt.Println(m.Payload) case *redis.Pong: // 收到Pong消息 default: // handle error }
例子2:
使用golang channel的方式处理消息
// 订阅channel1这个channel sub := client.Subscribe("channel1") // sub.Channel() 返回go channel,可以循环读取redis服务器发过来的消息 for msg := range sub.Channel() { // 打印收到的消息 fmt.Println(msg.Channel) fmt.Println(msg.Payload) }
例子3:
取消订阅
// 订阅channel1这个channel sub := client.Subscribe("channel1") // 忽略其他处理逻辑 // 取消订阅 sub.Unsubscribe("channel1")
2.PSubscribe
用法跟Subscribe一样,区别是PSubscribe订阅通道(channel)支持模式匹配。
例子:
// 订阅channel1这个channel sub := client.PSubscribe("ch_user_*") // 可以匹配ch_user_开头的任意channel
3.Publish
将消息发送到指定的channel
// 将"message"消息发送到channel1这个通道上 client.Publish("channel1","message")
4.PubSubChannels
查询活跃的channel
// 没有指定查询channel的匹配模式,则返回所有的channel chs, _ := client.PubSubChannels("").Result() for _, ch := range chs { fmt.Println(ch) } // 匹配user_开头的channel chs, _ := client.PubSubChannels("user_*").Result()
5.PubSubNumSub
查询指定的channel有多少个订阅者
// 查询channel1,channel2两个通道的订阅者数量 chs, _ := client.PubSubNumSub("channel1", "channel2").Result() for ch, count := range chs { fmt.Println(ch) // channel名字 fmt.Println(count) // channel的订阅者数量 }