2013-02-28 4 views
1

Я использую ICacheClient из библиотеки servicestack с Redis в качестве бэкэнд.Использование ServiceStack ICacheClient с Redis и Ninject

Я также использую Ninject для DI.

Я пытаюсь выяснить, в какой области можно связать менеджера PooledRedisClient.

Я попытался следующие:

Bind<ICacheClient>().ToMethod(ctx => new PooledRedisClientManager(redisURI)).InSingletonScope(); 

Это, кажется, работает нормально, но я постоянно вижу RedisResponseExceptions.

Я думаю, что это связано с тем, что у меня заканчиваются соединения.

Возможно, что SingletonScope неверен?

Может ли кто-нибудь указать мне правильное направление? Я использую версию servicestack: 3.9.0

EDIT

Является ли это правильное использование?

Bind<ICacheClient>().ToMethod(ctx => new PooledRedisClientManager(redisURI).GetCacheClient()).InSingletonScope(); 
+0

возможно @mythz может перезвонить здесь? Я видел похожие вопросы, но не смог найти окончательного ответа. – stephen776

+0

Я только что получил уведомление по электронной почте от моего провайдера redis, в котором говорилось, что у меня заканчивается клиентское соединение, поэтому я думаю, что это моя проблема. Haha – stephen776

+0

. Вы не должны заканчивать соединения, когда зарегистрирован как singleton [поскольку весь доступ redis завернут в блок использования] (https://github.com/ServiceStack/ServiceStack.Redis/blob/master/tests/ServiceStack.Redis.Tests/ServiceStack.Redis/PooledRedisClientManager.ICacheClient .cs). Вероятно, у вас есть другая проблема, не связанная с этим. – mythz

ответ

2
Bind<ICacheClient>().ToMethod(ctx => new PooledRedisClientManager(redisURI).GetCacheClient()).InSingletonScope(); 

Не знакомы с синтаксисом Ninject, но кажется, что выше, может быть создание нового экземпляра PooledRedisClientManager каждый раз ICacheClient разрешен? Не знаете, где «InSingletonScope» применяется в цепочке.

Возможно, что SingletonScope неверен?

UPDATE Singleton правильно и необходимо, чтобы получить выгоды от объединения CacheClients. Наличие одного экземпляра PooledRedisClientManager, содержащего коллекцию CacheClients (пул), будет извлекать существующие CacheClients вместо открытия новых. Вы можете ограничить размер пула, передав в параметре poolSize в конструкторе (по умолчанию 10?).

Вы также можете использовать BasicRedisClientManager, который не будет объединять соединения и всегда открывать и удалять CacheClient.

Неверный SingletonScope. Я понимаю, что если вы создадите свой PooledRedisClientManager Singleton, он никогда не уничтожит и не закроет созданные RedisClients. Идея Singleton заключается в создании единственного экземпляра (в данном случае PooledRedisClientManager), который всегда будет использоваться и не будет удален. Каждый RedisClient, созданный вашим PooledRedisClientManager (путем вызова GetClient()), отложит PooledRedisClientManger, чтобы избавиться от него. Экземпляры PooledRedisClientManager не хотят избавляться от своих RedisClients, просто верните их в «пул» как неактивные.

+0

Спасибо за объяснение. Надеюсь, @mythz может подтвердить это. – stephen776

+0

Вы действительно получили это прямо здесь: http://stackoverflow.com/a/14861035/85785 - RedisClientsManager должен находиться в области Singleton. Бывает, что «PooledRedisClientsManager» также реализует «ICacheClient», который должен быть зарегистрирован как одноэлементный, поскольку [каждая операция завершена в блок использования] (https://github.com/ServiceStack/ServiceStack.Redis/blob/master/tests /ServiceStack.Redis.Tests/ServiceStack.Redis/PooledRedisClientManager.ICacheClient.cs) – mythz

+0

Обновлено и, надеюсь, исправлено в моем ответе. – paaschpa

Смежные вопросы