2

我刚开始阅读有关 ServiceStack 的会话和缓存机制的信息,所以我可能会遗漏一些东西。有没有办法在 ServiceStack 中使用多个 ICacheClient 实现?

根据https://github.com/ServiceStack/ServiceStack/wiki/Sessionshttps://github.com/ServiceStack/ServiceStack/wiki/Caching您可以添加一个会话插件,如下所示:

public override void Configure(Container container)
{
    Plugins.Add(new SessionFeature());
}

您可以像这样注册一个特定的 ICacheClient 实现:

container.Register<ICacheClient>(new MemoryCacheClient());

我在想的是,您可能会遇到需要有状态服务来维持大量会话状态以获得最佳性能的情况,但对于更典型的缓存要求,您可能希望使用 Redis 之类的东西:

container.Register<IRedisClientsManager>(c => 
    new PooledRedisClientManager("localhost:6379"));
container.Register<ICacheClient>(c => 
    (ICacheClient)c.Resolve<IRedisClientsManager>().GetCacheClient());

但是有没有办法在这些之间切换?您是否必须手动创建提供程序(绕过 IoC)并将其用于内存或 Redis 缓存(将 IoC 用于其他 ICacheClient 实例)?或者围绕两个 ICacheClient 实现创建一个包装器,并使用特殊键命名模式之类的东西在使用内存缓存与 Redis 缓存之间进行内部切换?

另外,您将如何处理通过 ISession 访问数据?当您直接引用自动连接的 ICacheClient 属性时,您能否在使用 Redis 时使用内存中的 ICacheClient 支持 ISession?

4

1 回答 1

3

Servicestack 会话状态使用 ICacheClient 维护。您需要决定您希望 servicestack 使用哪个提供程序进行缓存,并按照您的描述进行设置 - 即 Memcached:

container.Register<ICacheClient>(new MemoryCacheClient());

如果您想使用另一种类型的缓存,请在 IOC 中注册它,给出:

container.Register<ICacheClient>(new MemoryCacheClient());  // For servicestack session state

//REDIS for other caching options
container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("localhost:6379"));
container.Register<IREDISClient>(c => (IREDISClient)c.Resolve<IRedisClientsManager>().GetClient());

然后,您的不同类将通过定义所需的缓存接口来使用最合适的缓存提供程序:

public ICacheClient Cache { get; set; }

或者

public IREDISClient REDISCache { get; set; }

您可以通过扩展 servicestack 服务类并创建您自己的 appservicebase 来使两者在您的服务中可用,如socialbootstrap 项目中所示。然后,您可以使两种缓存模型都可用。

我使用 REDIS 进行所有缓存,它的速度足以满足我的需求,并且在多服务器架构中,允许在不丢失任何用户会话的情况下关闭服务器进行维护。

我仍然有两个缓存提供程序,标准的 REDIS 客户端 - 连接到 ICacheClient - 和本机 REDIS 客户端 - 连接到 IRedisNativeClient。这是由于标准 REDIS 客户端使用的序列化无法处理我需要暂时保留的一些非 POCO 对象。

于 2013-03-19T21:38:45.630 回答