ASP.NET CoreのCache・Sessionに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
ソース
それでは、ソースの説明に入ります。まず「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>
実行結果
キャッシュだけ利用したキャプチャを示します。
筆休め
本章では、セッションを格納する手段としてRedisを利用しました。高パフォーマンスかつスケーラビリティがある環境がますます求められる中、WEB開発者も日々新しい技術を利用しなければいけません。(今回もレガシーになりつつある技術の記事ですが、参考としてまとめています)
以上、「ASP.NET CoreのCache・SessionにRedisを使う」でした。