要订阅StackExchange.Redis.ISubscriber的实例,需要调用以下API:
void Subscribe(RedisChannel channel, Action<RedisChannel, RedisValue> handler, CommandFlags flags = CommandFlags.None);
问题是,如果使用与简单字符串相同的通道名称调用同一行代码,会发生什么?说“TestChannel”?
ISubscriber是否检查字符串相等或者它不关心,因此我们将有两个订阅?
答案 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)
频道可能有多个订阅者。订阅同一频道的所有客户都将收到在此指定频道上发布的消息。