C#上級

上級 C#で学ぶキャッシュ戦略|練習問題編

導入

キャッシュ戦略は、システムのパフォーマンスを向上させるための重要な手法です。特に、データベースへのアクセスが頻繁なアプリケーションにおいては、キャッシュを利用することで応答時間を大幅に短縮できます。この記事では、実際の業務で遭遇する特定のシチュエーションに基づいたキャッシュ戦略について学び、その実装方法をC#を用いて解説します。

教科書レベルの解説(キャッシュ戦略)

重要な概念の整理

キャッシュ戦略には様々なアプローチがありますが、ここでは「メモリキャッシュ」と「ディスクキャッシュ」の違いに焦点を当てます。メモリキャッシュは、データをRAMに保持することで高速なアクセスを実現します。一方、ディスクキャッシュは、ストレージデバイスにデータを保存し、必要に応じて読み込みます。この2つのキャッシュ戦略を適切に使い分けることで、システム全体の効率を高めることが可能です。

コード例(C#)


using System;
using System.Collections.Generic;

public class Cache
{
    private Dictionary _cache = new Dictionary();
    private TimeSpan _defaultExpiration;

    public Cache(TimeSpan defaultExpiration)
    {
        _defaultExpiration = defaultExpiration;
    }

    public void Add(string key, T value)
    {
        var expiration = DateTime.Now.Add(_defaultExpiration);
        _cache[key] = (value, expiration);
    }

    public T Get(string key)
    {
        if (_cache.TryGetValue(key, out var cacheItem))
        {
            if (cacheItem.expiration > DateTime.Now)
            {
                return cacheItem.value;
            }
            else
            {
                _cache.Remove(key);
            }
        }
        throw new KeyNotFoundException("Key not found in cache.");
    }
}

コードの行ごとの解説

  1. using ディレクティブで必要な名前空間をインポートします。
  2. Cacheクラスは、ジェネリック型Tを受け入れ、キャッシュの機能を提供します。
  3. Dictionaryを使用して、キャッシュされたアイテムを格納します。キーは文字列、値はタプルでキャッシュされたデータとその有効期限を保持します。
  4. コンストラクタでデフォルトの有効期限を設定します。
  5. Addメソッドで、指定されたキーと値をキャッシュに追加します。有効期限は現在時刻にデフォルトの有効期限を加算したものです。
  6. Getメソッドは、指定されたキーのキャッシュアイテムを取得します。有効期限が切れている場合は、アイテムを削除し、例外をスローします。

練習問題編

以下の練習問題に取り組んでみましょう。

  1. キャッシュの有効期限を動的に変更する方法を考え、実装してください。

    模範解答: Addメソッドに有効期限を引数として追加し、呼び出し元で動的に指定できるようにします。

  2. キャッシュからアイテムを削除するメソッドを追加してください。

    模範解答: Removeメソッドを追加し、指定されたキーを持つアイテムをキャッシュから削除します。

  3. キャッシュのサイズ制限を設け、制限を超えた場合の動作を定義してください。

    模範解答: Dictionaryのサイズをチェックし、制限を超えた場合は古いアイテムから削除するロジックを実装します。

  4. キャッシュのヒット率を計測する機能を追加してください。

    模範解答: ヒットした回数とミスした回数をカウントし、ヒット率を計算するプロパティを追加します。

まとめ

  • キャッシュ戦略は、システムのパフォーマンス向上に寄与します。
  • メモリキャッシュとディスクキャッシュの違いを理解し、適切に使い分けることが重要です。
  • 実装時には、キャッシュの管理やメンテナンスを考慮する必要があります。