c# - IRedis订阅连接

标签 c# redis servicestack

我正在使用 Service Stack 连接到 Redis 并使用 SubPub 功能。

我应该保持 IRedisSubscription 和 IRedisClient 实例化处于事件状态吗?例如,我应该将其分配给类级别变量吗?

或者我可以简单地将其范围限制在 using 语句中,并且服务堆栈将处理持久性吗?

也就是说,以下哪个示例是正确的:

public class RedisPubSub1 : IDisposable {

    private static PooledRedisClientManager ClientPool = new PooledRedisClientManager("connectionString");
    private IRedisSubscription _subscription;
    private IRedisClient _client;

    private Action<string, string> _publish;
    public event Action<string, string> Publish {
        add { _publish += value; }
        remove { _publish -= value; }
    }

    public RedisPubSub1()
    {         
        Task.Factory.StartNew(() =>
            {
                _client = ClientPool.GetClient();
                _subscription = _client.CreateSubscription();
                    {
                        _subscription.OnMessage = EnqueEvent;
                        _subscription.SubscribeToChannels(new string[] { Channel });
                    }
        });
    }

    private void EnqueEvent(string channel, string message)
    {
        if (_publish!= null)
            _publish(channel, message);
    }      

    public void Dispose()
    {
        _subscription.Dispose();
        _client.Dispose();


    }
} }

或者

public class RedisPubSub2 {

    private static PooledRedisClientManager ClientPool = new PooledRedisClientManager("connectionString");

    private Action<string, string> _publish;

    public event Action<string, string> Publish {
        add { _publish += value; }
        remove { _publish -= value; }
    }

    public RedisPubSub2()
    {         
        Task.Factory.StartNew(() =>
            {
                using(var _client = ClientPool.GetClient())
                {
                    using(_subscription = _client.CreateSubscription()
                    {
                        _subscription.OnMessage = EnqueEvent;
                        _subscription.SubscribeToChannels(new string[] { Channel });
                    }
                }
        });
    }

    private void EnqueEvent(string channel, string message)
    {
        if (_publish!= null)
            _publish(channel, message);
    }       }

最佳答案

SubscribeToChannels 处于阻塞状态,因此您是否保留对连接的引用并不重要,因为除非您结束订阅(即取消订阅),否则它不会释放。

建议您在需要时实现某种方法来取消订阅,您希望对持有事件订阅的线程执行此操作,如 RedisMqServer example 中所示。 ,例如:

using (var subscription = redisClient.CreateSubscription())
{
    subscription.OnUnSubscribe = channel => 
       Log.Debug("OnUnSubscribe: " + channel);

    subscription.OnMessage = (channel, msg) =>
    {
        if (msg == "STOP")
        {
            Log.Debug("UnSubscribe From All Channels...");
            subscription.UnSubscribeFromAllChannels(); //Un block thread.
            return;
        }

        handleMessage(msg);
    }   

    ...

    //Unsubscribing will unblock this subscription:
    subscription.SubscribeToChannels(QueueNames.TopicIn); //blocks thread
}

关于c# - IRedis订阅连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17280022/

相关文章:

ruby-on-rails - 将 Activerecord 与 Redis 一起使用时出现错误

c# - ServiceStack 中的 Fluent Validation 没有错误消息

c# - 在 ASP.NET MVC 中发送项目集合

node.js - 如何从 Express 应用程序中删除调试?

c# - DateTime.CompareTo 实际返回什么整数?

node.js 数据库

asp.net-mvc - ServiceStack MemoryCacheClient 不缓存

events - ServiceStack中的ServerEventsClient并发模型

c# - 无法使用 C# 将消息添加到存储队列

c# - 我的枚举可以有友好的名字吗?