![](https://habrastorage.org/storage1/2bb1666a/c264dde9/fa77ed2d/50cf5585.png)
この記事では、Redisをリポジトリとして使用して、独自のセッションストアプロバイダーを作成した経験を共有したいと思います。
Redisについて多くのことが書かれています。 しかし、要するに、Redisはキーバリュー形式の非常に高速なストレージです(それだけではありません)。 それはそのようなタスクに非常に適しているように思われ、私のプロジェクトでそれを試してみるのは長い間興味深いものでした。
また、結果を実際に試してみたい人のために、ソースへのリンクを提供します。
なぜこれがすべて必要なのか
次の要件を満たすセッションリポジトリが必要でした。
1.セッションの書き込み/読み取りプロセスの制御
理由は後で説明します。
2.アプリケーションの複数のインスタンス間の分散。
アプリケーションを複数のサーバーに拡張します。
3.スピード。
理由はすべて明らかです。
免責事項
このコードがプロトタイプ段階にある間、すぐに言っておく必要があります。 プロジェクトで使用するかどうかは決めませんでしたが、ここで説明するものは誰かにとって興味深いものになると思います。 この出版物のmerc兵の意図もあります-多分誰かがこのアプローチの欠点を指摘してから、私が最終的に生産で使用することに決めます:)
私自身、Redisを2、3時間近く使っているので、おそらく改善すべき点があります(コメントでこれを聞いてうれしいです)。
Redisのインストールプロセスは省略されました。 Ubuntu ServerをVirtualBoxに持ち上げたと言えますが、それはいくつかのコマンドといくつかのファイルの編集の問題でした(静的IPおよびlocalhostだけでなくRedisが接続を受け入れることができるようにするため)。
また、セッションプロバイダーを備えたWindows Server AppFabric Cacheなどの既存のソリューションがあることを言及する必要がありますが、ポイント1のため、プロバイダーを(キャッシュ機能のみを使用して)記述する必要があり、速度の点ではRedisのようです速くなります。
独自のプロバイダーが必要な理由
セッションは基本的にKey-Valueのコレクションであり、この辞書はリクエストの開始時に取得され、リクエストの終了時に(変更の場合)記録されます。
セッションを使用する複数のリクエストがあり、読み取り専用であるだけでなく、その中のいくつかの値も変更する場合、 これらのリクエストは並行して実行できません 。 これは、標準プロバイダーでは、排他セッション(記録に必要)を使用できる要求は1つだけだからです。
各ページにいくつかのブロックが並行してロードされ(AJAX)、すべてがセッションへのアクセスを必要とします(各ブロックは変数を変更します)。 標準プロバイダーでは、それらは次々に実行されます。 そして並行して必要です。
セッションストアプロバイダーを実装するためのクラス
セッションプロバイダー用に実装する必要がある2つのメインクラスと1つの追加クラスがあります。
- SessionStateStoreProviderBaseから継承したRedisNoLockSessionStateStoreProvider 。 リポジトリからセッション(つまり、コレクション全体)を「取得」します。 彼のメソッドの名前は、最初は常に混乱していたことに注意してください:GetItem、RemoveItem、...名前によって、クラスがセッション内の個々のオブジェクトに責任があると判断できますが、そうではありません。
セッション要素を複数のクエリで並行して変更できる実装では、このクラスはほとんど何も行いません。
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
Copy Source | Copy HTML public class RedisNoLockSessionStateStoreProvider : SessionStateStoreProviderBase { //... public override SessionStateStoreData CreateNewStoreData(System.Web. HttpContext context, int timeout) { string sessionId = context.Request.Cookies[RedisNoLockSessionIDManager.CookieName].Value; return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (sessionId, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), timeout); } public override SessionStateStoreData GetItem(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { lockAge = TimeSpan .Zero; lockId = null ; locked = false ; actions = SessionStateActions .None; // RedisNoLockSessionStateItemsCollection return new SessionStateStoreData ( new RedisNoLockSessionStateItemsCollection (id, _defaultTimeout, _redisServer, _redisDb), SessionStateUtility.GetSessionStaticObjects(context), _defaultTimeout); } public override SessionStateStoreData GetItemExclusive(System.Web. HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) { return this .GetItem(context, id, out locked, out lockAge, out lockId, out actions); } //... }
-
- ISessionStateItemCollectionから継承されたRedisNoLockSessionStateItemsCollectionは、セッションの要素に正確にアクセスするために必要なすべてを実装するクラスです。 現在の実装では、彼はほとんどすべての作業を引き受けます。
以下のコードから、すべてがそこにどのように配置されているかは明らかだと思います。 アイデアは、すべてのアイテムが個別に取得および保存されるということです。
Copy Source | Copy HTML
- パブリッククラス RedisNoLockSessionStateItemsCollection : RedisSessionConfig 、 ISessionStateItemCollection
- {
- // ...
- パブリックオブジェクトthis [ 文字列名]
- {
- 得る
- {
- string key = GetKey(name);
- 使用 ( var redis = SingleRedisPool.GetClient(_redisServer))
- {
- return redis.Get < object >(key);
- }
- }
- セット
- {
- string key = GetKey(name);
- 使用 ( var redis = SingleRedisPool.GetClient(_redisServer))
- {
- bool result = redis.Set < object >(key、 value );
- }
- }
- }
- // ...
- }
- さて、3番目のクラスであるRedisNoLockSessionIDManagerは、セッションIDとCookieレコードの作成を担当し、非常に単純です。
Copy Source | Copy HTML
- パブリッククラス RedisNoLockSessionIDManager : RedisSessionConfig 、 ISessionIDManager
- {
- パブリック文字列 CreateSessionID( HttpContextコンテキスト)
- {
- Return Guid .NewGuid()。ToString( "N" );
- }
- パブリックストリング GetSessionID( HttpContextコンテキスト)
- {
- var cookie = context.Request.Cookies.Get(CookieName);
- return cookie!= null ? cookie.Value: null ;
- }
- public bool InitializeRequest( HttpContextコンテキスト、 bool suppressAutoDetectRedirect、 out bool supportSessionIDReissue)
- {
- supportSessionIDReissue = false ;
- falseを返します 。
- }
- public void SaveSessionID( HttpContextコンテキスト、 文字列 ID、リダイレクトされたbool 、 bool cookieが追加されました)
- {
- HttpCookie cookie = 新しい HttpCookie (CookieName、id);
- cookie.Expires = DateTime .Now.Add(Configuration.Timeout);
- context.Response.Cookies.Add(cookie);
- リダイレクト= false ;
- cookieAdded = true ;
- }
- public bool Validate( string id)
- {
- trueを返します 。
- }
- // ..
- }
おわりに
結論としていくつか述べたいと思います。
- このバージョンは、一見しただけで私のすべての問題を解決しますが、興味の対象外に構築されています。 慎重に使用する価値があります。
- 複数のリクエストがセッション内の同じ要素を変更しようとすると、ほぼ100%が問題になります。
- ソースコードには、より古典的な実装を備えたバージョンもあります。 コレクション全体を引き出してロックしますが、ほとんどテストしませんでした。 1人のユーザーからの並列リクエストをエミュレートするページがあり、さまざまなセッション実装を含めるとどのように機能するかを確認できます。
- 実際、ソースコード自体はredissessionstore.codeplex.comにあります。
私はあなたのコメントを聞いてうれしいです。 ご清聴ありがとうございました。