2012-05-13 46 views
2

我一直在做它是否正常或不緩存.NET會話狀態在外部的Dbs如Redis的,MongoDB的,或其它高度可擴展的工具的一些研究。.NET會話狀態緩存與Redis的,MongoDB的,ServiceStack

我的研究結果是,儘管MongoDB有更多的集成來完成這種事情,但似乎Redis性能更高,並且有更多選擇(關鍵過期,集合等)使用。

還有一個叫做ServiceStack的其他框架,它有一個RedisClient的實現,但是它的實現方式遠比我想要的要好得多。

public override object OnGet(CachedOrders request) 
    { 
     var cacheKey = "some_unique_key_for_order"; 
     return base.RequestContext.ToOptimizedResultUsingCache(this.CacheClient, cacheKey,() => 
      { 
        //This delegate will be executed if the cache doesn't have an item 
        //with the provided key 

       //Return here your response DTO 
       //It will be cached automatically 
      }); 
    } 

所以這個研究之後,我想知道你的意見,你是否在你的任何應用程序中實現這種緩存。你能分享你的經驗嗎?

謝謝!

回答

5

ServiceStack's緩存不耦合,ToOptimizedResultUsingCache()方法只是一個convenience Extension method允許您在必需的最小樣本文件中實現通用緩存模式。 ToOptimizedResult方法返回基於來自IRequestContext的MimeType和CompressionType的最優化結果。例如在JSON服務中,它通常是JSON Response DTO的deflate'd輸出。

您不必使用擴展方法,可以直接訪問ICacheClient API,因爲它是ServiceBase類中的自動接線屬性。如果您需要比ICacheClient API更多的功能,我推薦使用RedisServiceStack's C# RedisClient,這使您可以快速,原子訪問分佈式comp-sci集合。

使用ICacheClient API的好處是它是一個可測試的實現不可知的緩存接口,當前有InMemory, Redis and Memcached providers

0

我2年前寫了一個NuGet包對於這一點,我們已經使用它在生產從那時起一直。它覆蓋了.NET SessionStateProvider與自定義類,允許持久性的Redis,各種功能,如:

  • 只寫Redis的價值觀改變從多個請求
  • 併發會話訪問具有相同的會話ID
  • 能夠訪問來自網絡API會話(儘管這樣做違反了REST的原則,如果你關心)
  • 序列化格式的輕鬆定製(推出自己或更改JSON結構)

你可以在這裏得到它:https://www.nuget.org/packages/RedisSessionProvider

文檔:https://github.com/welegan/RedisSessionProvider