重复Redis订阅对同一频道名称的影响

时间:2016-12-16 21:17:28

标签: redis

要订阅StackExchange.Redis.ISubscriber的实例,需要调用以下API:

void Subscribe(RedisChannel channel, Action<RedisChannel, RedisValue> handler, CommandFlags flags = CommandFlags.None);

问题是,如果使用与简单字符串相同的通道名称调用同一行代码,会发生什么?说“TestChannel”?

ISubscriber是否检查字符串相等或者它不关心,因此我们将有两个订阅?

2 个答案:

答案 0 :(得分:2)

我假设您的问题针对 Redis API 本身。如果不是,请告诉我。

答案还基于您使用单个redis客户端连接的假设。

pubsub 地图是hashtable

回答你的问题:如果您使用相同的字符串多次订阅,您将继续只有一个订阅(您可以看到订阅基于此处的哈希表发生:https://github.com/antirez/redis/blob/3.2.6/src/pubsub.c)。

相反,调用单个取消订阅也会取消订阅您对该频道/模式的其他订阅。

如果它有帮助,这里是Go中的一个简单示例(我使用过go-redis库),它说明了答案的取消订阅和哈希表存储部分。

package main

import (
    "fmt"
    "log"
    "time"

    "github.com/go-redis/redis"
)

func main() {
    cl := redis.NewClient((&redis.Options{
        Addr:     "127.0.0.1:6379",
        PoolSize: 1,
    }))

    ps := cl.Subscribe()

    err := ps.Subscribe("testchannel")
    if err != nil {
        log.Fatal(err)
    }

    err = ps.Subscribe("testchannel")
    if err != nil {
        log.Fatal(err)
    }

    err = ps.Unsubscribe("testchannel")
    if err != nil {
        log.Fatal(err)
    }

    go func() {
        msg, err := ps.ReceiveMessage()
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(msg.Payload)
    }()

    err = cl.Publish("testchannel", "some value").Err()
    if err != nil {
        log.Fatal(err)
    }

    time.Sleep(10 * time.Second)
}

答案 1 :(得分:0)

频道可能有多个订阅者。订阅同一频道的所有客户都将收到在此指定频道上发布的消息。