【问题标题】:ServiceStack.Redis.RedisClient UnSubscribe function hangsServiceStack.Redis.RedisClient 取消订阅功能挂起
【发布时间】:2015-07-14 06:53:05
【问题描述】:

我尝试使用 RedisPubSubServer,但这不适用于关键通知,因为我需要订阅模式指定的频道。所以我创建了自己的解决方案:

public class RedisKeySubscriber
{
    public string Host { get; private set; }
    public int Port { get; private set; }

    private readonly Dictionary<string, IRedisSubscription> _subscriptions;

    public RedisKeySubscriber(string host, int port)
    {
        Host = host;
        Port = port;
        _subscriptions = new Dictionary<string, IRedisSubscription>();
    }

    public void Subscribe(string key, Action<string, string> handler)
    {
        lock (_subscriptions)
        {
            IRedisSubscription subscription;
            if (_subscriptions.TryGetValue(key, out subscription))
                return;

            // FIXME this might potentially create too many threads
            var client = new ServiceStack.Redis.RedisClient(Host, Port);
            subscription = client.CreateSubscription();
            subscription.OnMessage = handler;
            _subscriptions.Add(key, subscription);
            new Thread(() => subscription.SubscribeToChannelsMatching(key)).Start();
        }
    }

    public void Unsubscribe(string key)
    {
        lock (_subscriptions)
        {
            IRedisSubscription subscription;
            if (!_subscriptions.TryGetValue(key, out subscription))
                return;
            subscription.UnSubscribeFromChannelsMatching(key);
            _subscriptions.Remove(key);
        }
    }

    public void UnsubscribeAll()
    {
        lock (_subscriptions)
        {
            foreach (var subscription in _subscriptions)
                subscription.Value.UnSubscribeFromChannelsMatching(subscription.Key);
            _subscriptions.Clear();
        }
    }

    public void Dispose()
    {
        UnsubscribeAll();
    }
}

我意识到这挂在 PSUBSCRIBE 命令上。其他一切都很好。有什么想法吗?

【问题讨论】:

    标签: c# redis servicestack publish-subscribe


    【解决方案1】:

    我使用额外的“控制”通道解决了这个问题。因此,处理程序既订阅了匹配“key”的频道,也订阅了类似“CHCTRL:guid”的频道,其中 guid 是类实例创建的特定 GUID。 unsubscribe 函数在 CHCTRL:guid 上发布消息,处理程序可以理解是时候取消订阅了,因为消息不是来自“key”。

    替代和建议的解决方案是不使用 ServiceStack.Redis。

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 2012-05-26
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 2018-10-11
      • 2020-07-20
      相关资源
      最近更新 更多