2012-05-13 5 views
2

Redis、MongoDb、または他の高度にスケーラブルなツールなどの外部Dbで.NETセッション状態をキャッシュすることが大丈夫かどうかを調べています。Redis、MongoDB、ServiceStackを使用した.NETセッションステートキャッシング

私の研究の成果は、MongoDBがこのようなことを行うために統合されているにもかかわらず、Redisははるかに性能が高く、より多くのオプション(キーの有効期限やセットなど)を使用できるように思えます。

RedisClientの実装を持つServiceStackと呼ばれるこの他のフレームワークがありますが、実装されている方法は私が望むよりもはるかに結合されています。

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の出力が収縮します。

ServiceBaseクラスの自動配線プロパティであるので、拡張メソッドを使用する必要はありません。ICacheClient APIに直接アクセスできます。 ICacheClient APIが提供できる機能より多くの機能が必要な場合は、RedisServiceStack's C# RedisClientを使用することをお勧めします。これにより、分散comp-sciコレクションへの素早くアクセスできます。

ICacheClient APIを使用する利点は、実装可能な実装不可能なキャッシングインターフェイスであり、現在はInMemory, Redis and Memcached providersです。

0

私はこの2年前にNuGetパッケージを作成しました。それ以来、私たちはこれを本番環境で使用してきました。それはのようなさまざまな機能で、Redisのに永続性を可能にするカスタムクラスと.NET SessionStateProviderを上書きします:のみ同じセッションIDで複数の要求から

  • 同時セッションへのアクセスを変更する値にRedisのに書き込む

    • ウェブAPIからセッションにアクセスするための
    • 機能(あなたが気にしている場合そうすることが、RESTの原則に違反している)
    • シリアル化形式の簡単なカスタマイズ(自分自身または変更JSON構造をロール)

    あなたはここでそれを得ることができます:https://www.nuget.org/packages/RedisSessionProvider

    ドキュメント:https://github.com/welegan/RedisSessionProvider

  • 関連する問題