プロジェクトの用意

ワーカーロールを使用するので、Cloudサービスプロジェクトを作成します。

createproject

ロールは2つ用意し、片方をASP.NET Webロール、もう片方をキャッシュワーカーロールで作成します。

selecttemplate

ASP.NETプロジェクトテンプレートはMVCを選択します。

selecttemplate

WebRoleプロジェクトにNuGetでMicrosoft.WindowsAzure.Cachingパッケージをインストールします。

    PM> Install-Package Microsoft.windowsazure.Caching

このとき、パッケージマネージャーコンソールの既定のプロジェクトがWebRoleになっていないと参照できないので注意

ビュー

Home/Index.cshtmlを次のように編集します。

[html]
@{
ViewBag.Title = "Home Page";
}
<div class="jumbotron">
<h1>Cache Sample</h1>
@if (!string.IsNullOrEmpty(ViewBag.Message))
{
<div class="alert @ViewBag.MessageType">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
<strong>@ViewBag.Message</strong>
</div>
}
@using (Html.BeginForm("Index", "Home", null, FormMethod.Post, new { @class = "form-horizontal col-xs-12", role = "form" }))
{
<div class="form-group">
<label class="col-xs-2">Key</label>
<div class="col-xs-10">
<input class="form-control" name="Key" value="@ViewBag.Key" />
</div>
</div>
<div class="form-group">
<label class="col-xs-2">Value</label>
<div class="col-xs-10">
<input class="form-control" name="Value" value="@ViewBag.Value" />
</div>
</div>
<div class="form-group">
<div class="col-xs-2"></div>
<div class="col-xs-10">
<input type="submit" name="Save" value="Save" class="btn btn-primary" />
<input type="submit" name="Read" value="Read" class="btn btn-success" />
</div>
</div>
}
</div>
[/html]

コントローラ

HomeController.csを次のように編集します。

[csharp]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Microsoft.ApplicationServer.Caching;
namespace WebRole.Controllers
{
public class HomeController : Controller
{
private static DataCache _cache;
internal DataCache Cache
{
get
{
if (_cache == null)
{
_cache = new DataCache("default");
}
return _cache;
}
}
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(string key, string value)
{
var save = Request.RequestContext.HttpContext.Request.Form["Save"];
var read = Request.RequestContext.HttpContext.Request.Form["Read"];
if (!string.IsNullOrEmpty(save))
{
//cache.Add(key, value);
Cache.Put(key, value);
ViewBag.Key = key;
ViewBag.Message = "Saved";
ViewBag.MessageType = "alert-info";
}
else if (!string.IsNullOrEmpty(read))
{
ViewBag.Value = Cache.Get(key);
ViewBag.Key = key;
ViewBag.Message = "Read";
ViewBag.MessageType = "alert-success";
}
return View();
}
}
}
[/csharp]

DataCacheインスタンスは次のようにシングルトンで利用します。

[csharp]
private static DataCache _cache;
internal DataCache Cache
{
get
{
if (_cache == null)
{
_cache = new DataCache("default");
}
return _cache;
}
}
[/csharp]

生成するのに、Web.config確認したり割とオーバーヘッドがあるみたいなので、いちいち生成していたらキャッシュを導入する理由がないですものね。

ポストの中で、Submnitの値を確認して、処理を分けてます。Saveなら、Cache.Postで値の追加もしくは更新、ReadならCache.Getで値の取得です。Cache.AddだとKeyが重複した際は例外を吐きます。

チェック

起動してみます。クラウドサービスなので、エミュレータ上で走ることになり、起動は少し遅いですが気長に待ちます。

起動したら、さっそくKeyValueを入力し、Saveボタンを押します。

input

保存されました。

saved

そのまま、Readボタンを押します。

read2

キャッシュから呼び出されました。

まとめ

キャッシュのデフォルトの保存期間は10分だそうです。設定で変更も可能ですし、メソッドからでもできるとか(確認してない、おい。)
クラスタ設定などを行うと耐障害性能が上がるんだなあとも思いつつ、それはまたの機会にしようと手を抜きます。
何はともあれ、これで、キャッシュ環境が整いました。わーい。

CATEGORIES