PooledRedisClientManager不释放连接(PooledRedisClientMan

2019-08-16 23:25发布

我存储JSON数据的列表中的Redis和使用ServiceStack C#客户端访问它。 我基本上是管理自己的外键,我在那里存放zrange的id和我使用内部的接口,以我的应用程序从拉动ID的zrange ,然后从Redis的获取底层JSON对象并将其打包作为一个列表返回我的应用程序的其他部分。

我现在用的是PooledRedisClientManager我预期的Redis从执行代码的服务器不同的服务器上托管。

我在本地做在Windows 8上我所有的开发工作,使用Redis的MSOpenTech服务器。 目前我最大的挑战是,客户端连接不被关闭。

我Redis的留存被注入了一个实例IRedisClientManager (国际奥委会CastleWindsor)。 此代码执行的蔚蓝工作者作用的背景。

这就是我如何从一个zrange获取项目:

public class MyRedisPersister<T> : IResourcePersister<T>
{ 
    IRedisClientManager _mgr;
    public MyRedisPersister(IRedisClientManager mgr)
    {
        _mgr = mgr;
    }

    public IResourceList<T> Get<T>(string key, int offset, int count) where T
    {
        using (var redis = _clientManager.GetClient())
        {
            var itemKeys = redis.GetRangeFromSortedSet(key, offset, offset + count - 1).ToList();
            var totalItems = redis.GetSortedSetCount(key);

            if (itemKeys.Count == 0)
            {
                return new ResourceList<T>
                    {
                        Items = new List<T>(),
                        Offset = 0,
                        PageSize = 0,
                        TotalItems = 0,
                        TotalPages = 0
                    };
            }
            else
            {
                return new ResourceList<T>
                    {
                        Items = itemKeys.Select(k => redis.Get<T>(k)).ToList(),
                        Offset = offset,
                        PageSize = count,
                        TotalItems = totalItems,
                        TotalPages = (int) Math.Ceiling((float) totalItems/count)
                    };
            }
        }
    }
}

这是我的代码用于注册IRedisClientManager

var mgr = new PooledRedisClientManager(100, 10, "localhost:6379");
container.Register(Component.For<IRedisClientsManager>().Instance(mgr).LifeStyle.Singleton);

任何帮助将不胜感激。

Answer 1:

目前我最大的挑战是,客户端连接不被关闭。

您正在使用“PooledRedisClientManager”,所以我的理解是,客户端连接不应该被关闭,只是把入池重用。 它看起来像你的池大小为100个连接。

您可以尝试使用var mgr = new BasicRedisClientManager("localhost:6379")其中应配置的客户端。



Answer 2:

编辑不推荐使用下面的方法-你应该拿上IRedisClientsManager的依赖和包装所有Redis的客户端使用()块中调用,否则你被小鬼被咬伤。

我一直有越来越温莎与PooledRedisClientsManager发挥很好类似的问题,到底这似乎工作:

        container.Register(
            Component.For<IRedisClientsManager>()
                     .Instance(redisClients)
                     .LifestyleSingleton(),

            Component.For<IRedisClient>()
                     .UsingFactoryMethod(c => c.Resolve<IRedisClientsManager>().GetClient(),
                                        managedExternally: true));
    }

该managedExternally参数告诉温莎不要试图退役的担忧适用于IRedisClients,让PooledRedisClientsManager手柄循环。



文章来源: PooledRedisClientManager not releasing connections