テスターですが何か?

ホビープログラマ略してHPです

【日本語訳】Building Windows Azure Applications with the Caching Service part8

leave a comment »

このエントリーはMSDNのチュートリアル「Building Windows Azure Applications with the Caching Service」の「Task3-Enabling the Local Cache」の日本語訳になります。このコンテンツ、日本語訳全体については、こちらのエントリーを参照してください。

Task3 – Enabling the Local Cache

Windows Azure Caching Serviceを利用する際、キャッシュクラスタ上へ保存するのと同様に、ローカルクライアントのメモリ上にオブジェクトをキャッシュすることも出来ます。このエントリーでは、ローカルキャッシュを使用してキャッシュクラスタを利用した場合とアクセス時間の比較を行います。

1.MVCAzureStoreプロジェクトのServiceフォルダにあるProductRepository.csファイルを開きます。

Note: ファイルを編集する前にデバッグ実行中で無いことを確認してください。

2.ProductRepositoryクラスにて、フィールド・コンストラクタを以下のコードに置き換え、ローカルキャッシュの設定を行うロジックを追加します。

public class ProductsRepository : IProductRepository

{

    private static DataCacheFactory CacheFactory;

 

    private static DataCacheFactoryConfiguration FactoryConfig;

 

    private bool enableCache = false;

 

    private bool enableLocalCache = false;

 

    public ProductsRepository(bool enableCache, bool enableLocalCache)

    {

        this.enableCache = enableCache;

        this.enableLocalCache = enableLocalCache;

 

        if (enableCache)

        {

            if (enableLocalCache && (FactoryConfig == null || !FactoryConfig.LocalCacheProperties.IsEnabled))

            {

                TimeSpan localTimeout = new TimeSpan(0, 0, 30);

                DataCacheLocalCacheProperties localCacheConfig = new DataCacheLocalCacheProperties(10000, localTimeout,        DataCacheLocalCacheInvalidationPolicy.TimeoutBased);

                FactoryConfig = new DataCacheFactoryConfiguration();

                FactoryConfig.LocalCacheProperties = localCacheConfig;

                CacheFactory = new DataCacheFactory(FactoryConfig);

            }

            else if (!enableLocalCache && (FactoryConfig == null || FactoryConfig.LocalCacheProperties.IsEnabled))

            {

                CacheFactory = null;

            }

        }

 

        if (CacheFactory == null)

        {

            FactoryConfig = new DataCacheFactoryConfiguration();

            CacheFactory = new DataCacheFactory(FactoryConfig);

        }

    }

3.ControllerフォルダにあるHomeController.csファイルを久来、Indexアクションメソッドへ移動します。ProductsRepositoryのインスタンスを生成するコードを追加し、以下のコードで置き換えます。

public ActionResult Index()

{

    bool enableCache = (bool)this.Session["EnableCache"];

    bool enableLocalCache = (bool)this.Session["EnableLocalCache"];

 

    // リポジトリから商品情報を取得し、経過時間を計測する

    // Services.IProductRepository productRepository = new Services.ProductsRepository(enableCache);

    Services.IProductRepository productRepository = new Services.ProductsRepository(enableCache, enableLocalCache);

    Stopwatch stopWatch = new Stopwatch();

    stopWatch.Start();

4.Indexメソッドにて、IndexViewModelインスタンスを生成するコードと、以下のプロパティを追加します。

    // add all products currently not in session

    var itemsInSession = this.Session["Cart"] as List<string> ?? new List<string>();

    var filteredProducts = products.Where(item => !itemsInSession.Contains(item));

 

    IndexViewModel model = new IndexViewModel()

    {

        Products = filteredProducts,

        ElapsedTime = stopWatch.ElapsedMilliseconds,

        IsCacheEnabled = enableCache,

        IsLocalCacheEnabled = enableLocalCache,

        ObjectId = products.GetHashCode().ToString()

    };

    return View(model);

}

5.HomeControllerクラスに新しいアクションメソッドを追加し、UIからローカルキャッシュの有効/無効を制御可能にします。

public ActionResult EnableLocalCache(bool enabled)

{

this.Session["EnableLocalCache"] = !((bool)this.Session["EnableLocalCache"]);

    return RedirectToAction("Index");

}

6.Views\HomeフォルダにあるIndex.aspxファイルを開き、<div>タグ(elapsedTime)の上に以下のコードを追加します。

<fieldset>

    <legend>Cache settings for product data</legend>Enable Cache:

    <%if (Model.IsCacheEnabled)

      { %>

        Yes | <%=Html.ActionLink("No", "EnableCache", new { enabled = false }).ToString()%>

    <%}

      else

      { %>

        <%=Html.ActionLink("Yes", "EnableCache", new { enabled = true }).ToString()%> | No

    <%} %>

    <br />

    <%if (Model.IsCacheEnabled)

      { %>

    Use Local Cache:

        <%if (Model.IsLocalCacheEnabled)

          { %>

            Yes | <%=Html.ActionLink("No", "EnableLocalCache", new { enabled = false }).ToString()%>

            <%}

            else

          { %>

        <%=Html.ActionLink("Yes", "EnableLocalCache", new { enabled = true}).ToString() %> | No

     <%} %>

  <%} %>

    <div id="elapsedTime">Elapsed time: <%:Model.ElapsedTime.ToString()%> milliseconds.</div>

</fieldset>

7.F5キーを押下し、アプリケーションをビルド・エミュレーター上で実行します。

8.アプリケーション開始時点ではキャッシュは無効になっており、ローカルキャッシュを制御するリンクは非表示になっています。(キャッシュを有効にすることで表示されます。)キャッシュを有効にし、そしてローカルキャッシュも有効にしてください

9.処理時間が安定するまでページを何度か更新してください、アプリケーションがローカルメモリ上のキャッシュからデータを取得していると表示され、処理時間が驚くほど短く(おそらくミリ秒未満)なっていると思います。

image

図.17 ローカルキャッシュの利用

10.ページを何度更新しても、商品一覧の上に表示されているオブジェクトIDが固定になっていることに気づくと思います。つまり、リポジトリクラスから毎回同じオブジェクトが返されているということです。

Note: このことは非常に重要な点です。以前はローカルキャッシュが無効であったため、キャッシュから取得したデータを変更してもキャッシュされたデータには何の影響も与えません。その後も引き続き新規コピーを返します。ローカルキャッシュを有効にすると、メモリ上のオブジェクトへの参照を保持するため、オブジェクトへの変更は直接キャッシュへ影響をエ絶えます。アプリケーションでキャッシュを利用する際は、この点に注意する必要があります。つまり、キャッシュされたオブジェクトを取得後に変更して、再度同じデータを取得した時、加えた変更が反映されているかどうかはキャッシュがローカルから返されるか、リモートから返されるかに依存します。

11.30秒以上待ってページを最更新してください。処理時間が元の状態に戻りオブジェクトIDが更新されたことに気づくと思います。つまり、ポリシーで設定したキャッシュの有効期間が過ぎ、キャッシュが破棄されたことを表します。

次は「Exercise3: Creating a Reusable and Extensible Caching Layer」です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。