Redisによるセッション共有の実装方法

セッション共有のためのRedis設定

前回はSQL Serverを使用してセッションの共有化を実現しましたが、今回はRedisを利用してセッションを共有する方法について説明します。前回の記事ではsessionStateノードのmode="SQLServer"を使用して複数アプリケーション間でセッションを共有しましたが、実はmode="Custom"という設定があり、これによりRedisなどの外部キャッシュストレージにセッション情報を保存することが可能です。

Redisサーバー側の設定

Redisサーバーの構築方法については過去の記事を参照してください。今回はRedisを1台だけ起動し、ポート6379で動作させています。

Webアプリケーションの設定

RedisProviderの導入

Visual StudioのNuGetパッケージマネージャーから「redissession」を検索し、「RedisSessionProvider」をインストールします。このパッケージはWebFormsおよびMVCプロジェクト双方で使用可能です。

web.configの設定

インストール後、web.configファイルに以下のセッション状態の設定を追加します:

<sessionState mode="Custom" customProvider="RedisSessionProvider">
  <providers>
    <add name="RedisSessionProvider" 
         type="RedisSessionProvider.RedisSessionStateStoreProvider, RedisSessionProvider" 
         host="127.0.0.1" 
         port="6379" 
         accessKey="" 
         ssl="false"/>
  </providers>
</sessionState>

Global.asaxの設定

次に、Global.asaxファイルに以下のコードを追加し、Redisサーバーへの接続設定を行います:

using RedisSessionProvider.Config;
using StackExchange.Redis;

protected void Application_Start()
{
    ConfigurationOptions redisConfigOpts = ConfigurationOptions.Parse("127.0.0.1:6379");
    RedisSessionProvider.Config.RedisConnectionConfig.GetSERedisServerConfig = (HttpContextBase context) =>
    {
        return new KeyValuePair<string, ConfigurationOptions>(
            "DefaultConnection",
            redisConfigOpts);
    };
}

Redisへのセッションデータの保存確認

Redisクライアントであるredis-cliを使用して、セッションデータが正しく保存されているかを確認できます。6379ポートで動作するRedisに接続し、セッションIDに対応するキーが存在するか確認してください。

デモの実行

WebFormsアプリケーションとMVCアプリケーションを順番に起動します。MVC側でViewBagを使ってセッション情報にアクセスできることが確認できます。

実運用における考慮点

今回の例はあくまで簡単なデモですが、実際のプロダクション環境では、以下のような構成が一般的です:

  • Webサーバー間の負荷分散にNginxを利用
  • Redisの高可用性を確保するためのマスタースレーブ構成
  • Redisサーバー間の負荷分散にもNginxなどを導入

このような構成により、システムの水平スケーラビリティを容易に実現できます。

タグ: redis SessionState ASP.NET MVC WebForms

7月16日 22:28 投稿