servicestack,Session,Caching,servicestack" /> servicestack,Session,Caching,servicestack" />

Session 使用ServiceStack的多个ICacheClient实现

Session 使用ServiceStack的多个ICacheClient实现,session,caching,servicestack,Session,Caching,servicestack,我刚刚开始了解ServiceStack的会话和缓存机制,因此可能会遗漏一些东西。有没有一种方法可以将多个ICacheClient实现与ServiceStack一起使用 根据,您可以添加一个会话插件,如下所示: public override void Configure(Container container) { Plugins.Add(new SessionFeature()); } 您可以注册特定的ICacheClient实现,如下所示: container.Register&l

我刚刚开始了解ServiceStack的会话和缓存机制,因此可能会遗漏一些东西。有没有一种方法可以将多个ICacheClient实现与ServiceStack一起使用

根据,您可以添加一个会话插件,如下所示:

public override void Configure(Container container)
{
    Plugins.Add(new SessionFeature());
}
您可以注册特定的ICacheClient实现,如下所示:

container.Register<ICacheClient>(new MemoryCacheClient());
container.Register(newmemorycacheclient());
我的想法是,在某些情况下,您可能需要一个有状态的服务来维护大量会话状态以获得最大性能,但对于更典型的缓存需求,您可能希望使用Redis:

container.Register<IRedisClientsManager>(c => 
    new PooledRedisClientManager("localhost:6379"));
container.Register<ICacheClient>(c => 
    (ICacheClient)c.Resolve<IRedisClientsManager>().GetCacheClient());
container.Register(c=>
新的PooledRedisClientManager(“本地主机:6379”);
容器。寄存器(c=>
(ICacheClient)c.Resolve().GetCacheClient());
但是有没有办法在这两者之间切换呢?您是否需要手动创建一个提供程序(绕过IoC)并将其用于内存或Redis缓存(将IoC用于其他ICacheClient实例)?或者围绕这两个ICacheClient实现创建一个包装器,并使用特殊的密钥命名模式在内部使用内存缓存与Redis缓存之间切换


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

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

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

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

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


我仍然有两个缓存提供程序,标准的REDIS客户端(连接到ICacheClient)和本机REDIS客户端(连接到IRedisNativeClient)。这是因为标准REDIS客户端使用的序列化没有处理一些我需要临时保存的非POCO对象。

Mythz被您的编辑弄糊涂了-我对答案做了一些修改,试图更好地解释我的意思。我不知道您为什么要编造不存在的接口?这段代码不会编译。不,它不会编译,需要定义接口。我试图演示如何拥有两个不同的缓存提供程序,确保将ICacheClient设置为用于会话状态的缓存提供程序,以及在仍然使用IOC的情况下可在应用程序中根据需要使用的第二个缓存提供程序。我已经编辑了答案,以使用国际奥委会现有的iDisc客户端。还在学习:)
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; }