一、基本订阅发布实现
1)消息发布
使用Publish方法向指定频道发送消息,该方法会返回成功接收此消息的订阅者数量。代码示例如下:
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis地址
Password: "", // 密码
DB: 0, // 数据库编号
})
ctx := context.Background()
ret := rdb.Publish(ctx, "topic", "data")
if ret.Err() != nil {
fmt.Println(ret.Err())
}
fmt.Println("send subscriber num:", ret.Val())
}
2)订阅消息
通过Subscribe方法创建订阅,并使用ReceiveMessage实现消息的阻塞式接收 。调用ReceiveMessage方法后,从返回的msg对象中通过channel属性获取订阅主题,通过payload属性读取接收到的数据。代码示例如下:
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis地址
Password: "", // 密码
DB: 0, // 数据库编号
})
ctx := context.Background()
pubsub := rdb.Subscribe(ctx, "topic")
defer pubsub.Close()
for {
msg, err := pubsub.ReceiveMessage(ctx)
if err != nil {
continue
}
fmt.Printf("channle: %s, data: %s\n", msg.Channel, msg.Payload)
}
}
二、订阅发布高级用法
1)订阅多个主题消息
调用Subscribe方法传入多个主题,代码示例如下:
pubsub := rdb.Subscribe(ctx, "topic1", "topic2")
需要根据不同的主题识别不同的消息时,可以根据ReceiveMessage方法返回的msg对象中channel属性获取订阅主题,以区分具体处理。
2)模式匹配订阅
使用PSubscribe方法,通过通配符模式订阅多个主题消息,代码示例如下:
pubsub := rdb.PSubscribe(ctx, "topic*")
也支持传入多个通配符,代码示例如下:
pubsub := rdb.PSubscribe(ctx, "topic*", "name*")
支持以下通配符:
1)*:匹配零个或多个任意字符。
2)?:匹配任意单个字符。
3)[abc]:匹配a、b或c中的任意一个字符。
4)[a-z]:匹配a到z范围内的任意一个字符。
3)Channel封装
使用 Go 通道传递消息,优化消费处理逻辑,代码示例如下:
ch := pubsub.Channel()
for msg := range ch {
fmt.Printf("channle: %s, data: %s\n", msg.Channel, msg.Payload)
}
三、注意事项
1)无消息存储:Pub/Sub模式不具备消息持久化功能,订阅者离线期间的消息将无法保留。
2)实时推送:消息发布后立即广播给所有订阅者。
3)广播机制:每条消息会同时发送给所有订阅该频道的客户端。
4)主题隔离:各主题消息完全独立,互不干扰。