PooledRedisClientManager nie zwalnia połączeń
Przechowuję listy danych json w redis i uzyskuję do nich dostęp za pomocą klienta ServiceStack c #. W zasadzie zarządzam własnymi kluczami obcymi, w których przechowujęzrange
identyfikatorów i używam interfejsu wewnętrznego mojej aplikacji, aby pobrać identyfikatory zzrange
a następnie pobierz podstawowe obiekty json z Redis i spakuj je jako listę, aby powrócić do innych części mojej aplikacji.
UżywamPooledRedisClientManager
ponieważ przewiduję, że Redis będzie hostowany na innym serwerze niż serwer wykonujący kod.
Robię wszystkie moje prace rozwojowe lokalnie na Windows 8, używając serwera MSOpenTech Redis. Obecnie moim największym wyzwaniem jest to, że połączenia klientów nie są zamykane.
Moja persistra Redis jest wstrzykiwana za pomocą instancjiIRedisClientManager
(IoC to CastleWindsor). Ten kod działa w kontekście roli robotnika lazurowego.
W ten sposób pobieram elementy z 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)
};
}
}
}
}
To jest kod, którego używam do rejestracjiIRedisClientManager
var mgr = new PooledRedisClientManager(100, 10, "localhost:6379");
container.Register(Component.For<IRedisClientsManager>().Instance(mgr).LifeStyle.Singleton);
Każda pomoc byłaby bardzo mile widziana.