Go-Redis入门指南:订阅发布详解

一、基本订阅发布实现

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)主题隔离:各主题消息完全独立,互不干扰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值