要订阅 StackExchange.Redis.ISubscriber 的实例,需要调用以下 API:
void Subscribe(RedisChannel channel, Action<RedisChannel, RedisValue> handler, CommandFlags flags = CommandFlags.None);
Run Code Online (Sandbox Code Playgroud)
问题是,如果有人使用与简单字符串相同的通道名称调用同一行代码,例如“TestChannel”,会发生什么?
ISubscriber 是否检查字符串是否相等,或者它只是不在乎,因此我们将有两个订阅?
我假设您的问题是针对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)