我在redis中存储json数据列表并使用ServiceStack c#client访问它。我基本上管理自己的外键,我存储zrange
个ID,我使用我的应用程序内部的接口从zrange
中提取id,然后获取底层的json来自Redis的对象并将它们打包为列表以返回我的应用程序的其他部分。
我正在使用PooledRedisClientManager
,因为我预计Redis将被托管在与执行代码的服务器不同的服务器上。
我正在使用MSOpenTech Redis服务器在Windows 8上本地完成所有开发工作。目前我最大的挑战是客户端连接没有被关闭。
My Redis persister正在注入一个IRedisClientManager
的实例(IoC是CastleWindsor)。此代码在azure worker角色的上下文中执行。
这是我从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);
非常感谢任何帮助。
答案 0 :(得分:8)
目前我最大的挑战是客户端连接没有关闭。
您正在使用'PooledRedisClientManager',因此我的理解是不应关闭客户端连接,只需将其放入池中以便重用。看起来你的游泳池大小是100个连接。
您可以尝试使用
var mgr = new BasicRedisClientManager("localhost:6379")
哪个应该处理客户。
答案 1 :(得分:2)
编辑不建议使用以下方法 - 您应该依赖IRedisClientsManager并将所有redis客户端调用包含在using()块中,否则将为被gremlins咬伤。
我一直遇到类似的问题让Windsor与PooledRedisClientsManager很好地配合,最后这似乎有用:
container.Register(
Component.For<IRedisClientsManager>()
.Instance(redisClients)
.LifestyleSingleton(),
Component.For<IRedisClient>()
.UsingFactoryMethod(c => c.Resolve<IRedisClientsManager>().GetClient(),
managedExternally: true));
}
managedExternally参数告诉Windsor不要尝试将解除授权问题应用于IRedisClients,并让PooledRedisClientsManager处理回收。