2013-03-19 58 views
2

我刚开始阅读有关ServiceStack的会话和缓存机制,因此我可能会漏掉一些东西。有没有办法在ServiceStack中使用多个ICacheClient实现?使用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属性时,您是否可以使用内存中的ICacheClient支持ISession,同时使用Redis?

回答

3

使用ICacheClient维护ServiceStack会话状态。您需要决定你想要servicestack用于缓存,并设置成你所描述的提供者 - 即Memcached的:

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

如果你想使用另一种类型的缓存注册它在国际奥委会,赠送:然后

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 project展示都让您的服务提供。然后,您可以使两个缓存模型可用。

我使用REDIS进行所有缓存,它足够快速满足我的需求,并且在多服务器架构中允许服务器停机维护,而不会丢失任何用户会话。

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

+0

神话,被你的编辑弄糊涂了 - 我已经重新修改了答案,试图更好地解释我的意思。 – MikeT 2013-03-20 09:39:56

+0

我不知道你为什么要编写不存在的接口?这段代码不会编译。 – mythz 2013-03-20 14:51:39

+0

不,它不会编译,接口需要被定义。我试图演示如何使用两个不同的缓存提供程序,以确保ICacheClient被设置为会话状态所使用的那个,另一个可以在应用程序中用作会话状态,同时仍然使用IOC。 – MikeT 2013-03-20 17:08:16