読者です 読者をやめる 読者になる 読者になる

kikki's tech note

技術ブログです。UnityやSpine、MS製品など技術色々について解説しています。

ASP.NET CoreのCache・SessionにRedisを使う

ASP.NET Core C# Redis

本章では、ASP.NET CoreでCacheやSessionを利用できるように設定します。また合わせて、セッション情報をRedisで利用できるよう調整します。

はじめに

セッションは旧来、Webサーバのメモリ上やデータベース上に展開されることが多くありました。ただそれぞれに以下の問題がありました。

  • WEBサーバのメモリ
    • セッションの冗長構成が難しい
  • データベース
    • パフォーマンスに難あり

Redisでは、メモリ上にデータが保持されます。そのため、セッション情報といった高頻度に更新・参照される場合に強みを発揮します。またWEBサーバーと切り離されているため、キャッシュサーバー専用に冗長構成を取ることができ、スケールアップアウトにも強い特徴があります。そこで今回Sessionの保存先として、Redisを利用します。

準備

Chocolateyをインストール

  • 管理者権限でコマンドプロンプトを実行
  • 以下のサイトの「Cmd.exe」に書かれているコマンドをコピー

https://chocolatey.org/installchocolatey.org

Redisをインストール

  • 以下サイトに書かれているコマンドをコピー

Chocolatey Gallery | Redis 64-bit 3.0.503

これでRedisがインストールされました。

Redisの起動確認

インストール確認のため、以下コマンドを打つと「PONG」が返ってくれば成功。

redis-cli ping

また起動コマンドと終了コマンドは以下の通りです。

# 起動
redis-server
# 終了
redis-cli shutdown

プロジェクトにライブラリを追加

そしてASP.NET Coreプロジェクトに、NuGetパッケージから以下ライブラリを追加します。

ソース

それでは、ソースの説明に入ります。まず「Startup.cs」ファイルにSessionを利用すること、Redisをキャッシュサーバーとして利用することを明示します。
【Startup.cs】

    public class Startup
    {
        public static IConfigurationRoot Configuration { get; private set; }

        public Startup(IHostingEnvironment env)
        {
            // appsettings.jsonファイルの読み込み
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }
        public void ConfigureServices(IServiceCollection services)
        {
            // Redisを設定
            services.AddDistributedRedisCache(option =>
            {
                // appsettings.jsonファイルから参照先を読み込み
                // ※今回はlocalhostのRedisを利用
                option.Configuration = Configuration.GetConnectionString("RedisConnection");
                option.InstanceName = "HogeHogeInstance";
            });

            // セッションサービスを追加
            services.AddSession(options =>
            {
                // セッションで利用するCookieの名前を設定
                options.CookieName = ".HogeHoge.Session";
                // セッションの有効期限を設定
                options.IdleTimeout = TimeSpan.FromSeconds(20);
            });

            var mvc = services.AddMvc();
        }
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            // セッションを設定(app.UserMvc()の前に宣言)
            app.UseSession();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{param?}");
            });
        }
    }

合わせて、プロジェクトの設定ファイルにRedisの参照先を記述します。
【appsettings.json

{
  "ConnectionStrings": {
    "DefaultConnection": "【データベース接続文字列はここに記載】",
    "RedisConnection": "localhost"
  }
}

そしてControllerとCSHTMLファイルに、サンプルとして、キャッシュの設定参照、セッションの設定参照を記述します。
【Controllers/HomeController.cs】

    public class HomeController : Controller
    {
        private IDistributedCache cache;

        public HomeController(IDistributedCache _cache)
        {
            cache = _cache;
        }

        public ActionResult Index()
        {
            string value = cache.GetString("CacheTime");
            if (value == null)
            {
                value = DateTime.Now.ToString();
                cache.SetString("CacheTime", value);
            }
            ViewData["CacheTime"] = value;
            ViewData["CurrentTime"] = DateTime.Now.ToString();
            return View("index");
        }

        public IActionResult Post(string id)
        {
            HttpContext.Session.SetString("TestId", id);

            return RedirectToAction("Get");
        }

        public IActionResult Get()
        {
            string id = HttpContext.Session.GetString("TestId");
            if (!String.IsNullOrWhiteSpace(id))
            {
                ViewData["SessionData"] = id;
            }
            return View("index");
        }
    }

【Views/Home/Index.cshtml】

<ul>
    <li>@ViewData["CacheTime"]</li>
    <li>@ViewData["CurrentTime"]</li>
</ul>

@using (Html.BeginForm("Post", "Home", FormMethod.Post))
{
    <input type="text" name="id" />
    <input type="submit" value="送信" />
}

<span>@ViewData["SessionData"]</span>

実行結果

キャッシュだけ利用したキャプチャを示します。
f:id:kikkisnrdec:20161027203433p:plain

筆休め

本章では、セッションを格納する手段としてRedisを利用しました。高パフォーマンスかつスケーラビリティがある環境がますます求められる中、WEB開発者も日々新しい技術を利用しなければいけません。(今回もレガシーになりつつある技術の記事ですが、参考としてまとめています)

以上、「ASP.NET CoreのCache・SessionにRedisを使う」でした。

※無断転載禁止 Copyright (C) 2015 kikkisnrdec All Rights Reserved.