【问题标题】:Using ServiceStack ICacheClient with Redis and Ninject将 ServiceStack ICacheClient 与 Redis 和 Ninject 一起使用
【发布时间】:2013-02-28 14:35:58
【问题描述】:

我正在使用 servicestack 库中的 ICacheClient,并将 Redis 作为后端。

我也在使用 Ninject 进行 DI。

我正在尝试确定在哪个范围内绑定 PooledRedisClient 管理器。

我尝试了以下方法:

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

这似乎工作正常,但我经常看到RedisResponseExceptions。

我认为这是因为我的连接用完了。

也许 SingletonScope 不正确?

谁能指出我正确的方向?我正在使用 servicestack 版本:3.9.0

编辑

这是正确的用法吗?

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

【问题讨论】:

  • 也许@mythz 可以在这里插话?我见过类似的问题,但找不到明确的答案
  • 我刚从我的 redis 提供商那里收到一封电子邮件通知,说我的客户端连接用完了,所以我认为这是我的问题哈哈
  • 在注册为单例since all redis access is wrapped in a using block 时,您不应该用完连接。您可能还有其他与此无关的问题。

标签: c# asp.net redis ninject servicestack


【解决方案1】:
Bind<ICacheClient>().ToMethod(ctx => new PooledRedisClientManager(redisURI).GetCacheClient()).InSingletonScope();

不熟悉 Ninject 语法,但似乎每次解析 ICacheClient 时,上述可能都会创建一个新的 PooledRedisClientManager 实例?不确定“InSingletonScope”在链中的应用位置。

也许 SingletonScope 不正确?

更新 Singleton 是正确的并且是获得池化 CacheClients 好处所必需的。拥有一个包含 CacheClients 集合(池)的 PooledRedisClientManager 实例将检索现有的 CacheClients 而不是打开新的。您可以通过在构造函数中传入 poolSize 参数来限制池大小(默认为 10?)。

您也可以使用 BasicRedisClientManager,它不会连接连接并始终打开和处置 CacheClient。

SingletonScope 不正确。我的理解是,如果您将 PooledRedisClientManager 设置为 Singleton,它将永远不会处理和关闭它创建的 RedisClients。 Singleton 的想法是创建一个将始终使用而不是使用的单个实例(在本例中为 PooledRedisClientManager)被处置。每个由 PooledRedisClientManager 创建的 RedisClient(通过调用 GetClient())都会推迟 PooledRedisClientManger 处理它。 PooledRedisClientManager 的实例不想处理它们的 RedisClients,只是将它们作为非活动状态放回“池”中。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 1970-01-01
相关资源
最近更新 更多