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

Kla*_*Nji 9 redis

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

void Subscribe(RedisChannel channel, Action<RedisChannel, RedisValue> handler, CommandFlags flags = CommandFlags.None);
Run Code Online (Sandbox Code Playgroud)

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

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

Sud*_*ddy 8

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

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

发布订阅地图是一个哈希表

回答您的问题:如果您使用相同的字符串多次订阅,您将继续只有一个订阅(您可以看到订阅是根据此处的哈希表进行的:https : //github.com/antirez/redis/blob /3.2.6/src/pubsub.c#L64

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

如果有帮助,这里是 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)
}
Run Code Online (Sandbox Code Playgroud)