2013-03-19 91 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