C#中級

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

導入

キャッシュ戦略は、データの取得や処理の効率を高めるための重要な手法です。特に、頻繁にアクセスされるデータを迅速に取得するために、メモリ内にキャッシュを持つことが多くのシステムで採用されています。この記事では、C#を使った具体的なキャッシュ戦略の実装例を通じて、実務で役立つ知識を深めていきます。

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

重要な概念の整理

キャッシュ戦略には、主に以下の概念が含まれます。

  • キャッシュの有効期限: データの鮮度を保つために、キャッシュに保存されたデータがいつまで有効であるかを設定します。
  • キャッシュのサイズ制限: メモリの使用量を管理するために、キャッシュに保存できるデータのサイズを制限します。
  • キャッシュの失効ポリシー: キャッシュがどのようにデータを削除するかを決定するルールです。最も一般的なものには、最も古いデータを削除するLRU(Least Recently Used)や、最も使われていないデータを削除するLFU(Least Frequently Used)があります。

コード例(C#)


using System;
using System.Collections.Generic;

public class SimpleCache
{
    private readonly Dictionary cache = new();
    private readonly TimeSpan cacheDuration;

    public SimpleCache(TimeSpan duration)
    {
        cacheDuration = duration;
    }

    public void Add(TKey key, TValue value)
    {
        var expiration = DateTime.Now.Add(cacheDuration);
        cache[key] = (value, expiration);
    }

    public bool TryGetValue(TKey key, out TValue value)
    {
        if (cache.TryGetValue(key, out var cachedItem) && cachedItem.Expiration > DateTime.Now)
        {
            value = cachedItem.Value;
            return true;
        }
        value = default;
        return false;
    }

    public void CleanUp()
    {
        var keysToRemove = new List();
        foreach (var kvp in cache)
        {
            if (kvp.Value.Expiration <= DateTime.Now)
            {
                keysToRemove.Add(kvp.Key);
            }
        }
        foreach (var key in keysToRemove)
        {
            cache.Remove(key);
        }
    }
}

コードの行ごとの解説

  1. using System;: 基本的なシステム機能を使用するための名前空間をインポートします。
  2. using System.Collections.Generic;: ジェネリックコレクションを使用するための名前空間をインポートします。
  3. public class SimpleCache: キャッシュのクラスを定義し、キーと値の型をジェネリックで指定します。
  4. private readonly Dictionary cache = new();: キャッシュのデータを保持するための辞書を定義します。
  5. private readonly TimeSpan cacheDuration;: キャッシュの有効期限を保持するフィールドを定義します。
  6. public SimpleCache(TimeSpan duration): コンストラクタでキャッシュの有効期限を設定します。
  7. public void Add(TKey key, TValue value): キャッシュにデータを追加するメソッドです。
  8. var expiration = DateTime.Now.Add(cacheDuration);: データの有効期限を計算します。
  9. public bool TryGetValue(TKey key, out TValue value): 指定されたキーの値を取得するメソッドです。
  10. public void CleanUp(): 有効期限切れのデータを削除するメソッドです。

練習問題編

以下の練習問題に挑戦し、キャッシュ戦略の理解を深めましょう。

  1. 問題1: キャッシュの有効期限を変更するメソッドを追加してください。

    模範解答: 新たに AddExpiration メソッドを作成し、指定したキーの有効期限を更新する実装を行います。

  2. 問題2: キャッシュのサイズ制限を追加し、制限を超えた場合は古いデータを削除するロジックを実装してください。

    模範解答: private readonly int maxSize; フィールドを追加し、データ追加時に if (cache.Count > maxSize) で古いデータを削除する処理を実装します。

  3. 問題3: キャッシュの使用状況を表示するメソッドを作成してください。

    模範解答: public void DisplayCacheStatus() メソッドを追加し、現在のキャッシュの内容をコンソールに表示する実装を行います。

まとめ

  • キャッシュ戦略は、データアクセスの効率を高めるための重要な手法です。
  • 具体的な実装例を通じて、キャッシュの有効期限やサイズ制限の管理方法を学びました。
  • 練習問題を通じて、実務に役立つキャッシュ戦略の理解をさらに深めることができます。