PooledRedisClientManager不释放连接

我在redis中存储json数据列表并使用ServiceStack c#client访问它。 我基本上管理我自己的外键,我存储一个zrange的id,我使用我的应用程序内部的接口从zrange提取id,然后从Redis获取底层的json对象并将它们打包为列表以返回我申请的其他部分。

我正在使用PooledRedisClientManager因为我预计Redis将托管在与执行代码的服务器不同的服务器上。

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

我的Redis persister正在注入一个IRedisClientManager实例(IoC是CastleWindsor)。 此代码在azure worker角色的上下文中执行。

这是我从zrange获取项目的方式:

 public class MyRedisPersister : IResourcePersister { IRedisClientManager _mgr; public MyRedisPersister(IRedisClientManager mgr) { _mgr = mgr; } public IResourceList Get(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 { Items = new List(), Offset = 0, PageSize = 0, TotalItems = 0, TotalPages = 0 }; } else { return new ResourceList { Items = itemKeys.Select(k => redis.Get(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().Instance(mgr).LifeStyle.Singleton); 

任何帮助将不胜感激。

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

您正在使用’PooledRedisClientManager’,因此我的理解是不应关闭客户端连接,只需将其放入池中以便重用。 看起来你的游泳池大小是100个连接。

您可以尝试使用var mgr = new BasicRedisClientManager("localhost:6379")来处理客户端。

编辑不建议使用以下方法 – 您应该依赖IRedisClientsManager并将所有redis客户端调用包含在using()块中,否则您被gremlins咬住。

我一直有类似的问题让Windsor与PooledRedisClientsManager很好地配合,最后这似乎有效:

  container.Register( Component.For() .Instance(redisClients) .LifestyleSingleton(), Component.For() .UsingFactoryMethod(c => c.Resolve().GetClient(), managedExternally: true)); } 

managedExternally参数告诉Windsor不要尝试将解除授权问题应用于IRedisClients并让PooledRedisClientsManager处理回收。