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处理回收。