我刚刚开始阅读ServiceStack的会话和缓存机制,所以我可能会遗漏一些东西。有没有办法在ServiceStack中使用多个ICacheClient实现?
根据https://github.com/ServiceStack/ServiceStack/wiki/Sessions和https://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?
答案 0 :(得分:3)
使用ICacheClient维护Servicestack会话状态。你需要决定你希望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服务类并在socialbootstrap project中创建自己的appservicebase来使服务中的两者都可用。然后,您可以使两个缓存模型可用。
我使用REDIS进行所有缓存,它足够快地满足我的需求,并且在多服务器架构中允许服务器被删除以进行维护而不会丢失任何用户会话。
我仍然有两个缓存提供程序,标准REDIS客户端 - 连接到ICacheClient - 和本机REDIS客户端 - 连接到IRedisNativeClient。这是由于标准REDIS客户端使用的序列化不使用我需要暂时保留的一些非POCO对象。