TypeScript上級

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

導入

キャッシュ戦略は、パフォーマンスを向上させるための重要な手法です。特に、データ取得の頻度が高いAPIやデータベースに対して、キャッシュを適切に利用することで、レスポンスタイムの短縮やサーバー負荷の軽減が期待できます。本記事では、TypeScriptを用いた具体的なキャッシュ戦略の実装例を通じて、実務で役立つ知識を深めます。

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

重要な概念の整理

キャッシュ戦略には、メモリキャッシュ、ディスクキャッシュ、CDNキャッシュなどさまざまな種類があります。ここでは、メモリキャッシュを使用したデータの取得と保存の方法に焦点を当てます。メモリキャッシュは、データを一時的にメモリに保持することで、次回のデータ取得を迅速に行える利点があります。

コード例(TypeScript)


class Cache {
    private cache: Map = new Map();
    
    constructor(private ttl: number) {}

    set(key: string, value: T): void {
        const expiry = Date.now() + this.ttl;
        this.cache.set(key, { value, expiry });
    }

    get(key: string): T | null {
        const cached = this.cache.get(key);
        if (!cached) return null;

        if (Date.now() > cached.expiry) {
            this.cache.delete(key);
            return null;
        }

        return cached.value;
    }
}

// 使用例
const apiCache = new Cache(30000); // 30秒のTTL
apiCache.set('user_1', 'John Doe');
console.log(apiCache.get('user_1')); // 'John Doe'

コードの行ごとの解説

  1. class Cache<T> { – ジェネリック型を使用して、様々な型のデータをキャッシュできるクラスを定義。
  2. private cache: Map<string, { value: T; expiry: number }> = new Map(); – キャッシュのデータを保持するためのMapを初期化。
  3. constructor(private ttl: number) {} – コンストラクタで、キャッシュの有効期限を設定。
  4. set(key: string, value: T): void { – キャッシュにデータを追加するメソッド。
  5. const expiry = Date.now() + this.ttl; – データの有効期限を計算。
  6. get(key: string): T | null { – キャッシュからデータを取得するメソッド。
  7. if (!cached) return null; – キャッシュが存在しない場合はnullを返す。
  8. if (Date.now() > cached.expiry) { – キャッシュが期限切れの場合の処理。

練習問題編

以下に、キャッシュ戦略に関連する練習問題を用意しました。各問題に対する模範解答と解説も記載しています。

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

    
    updateTTL(key: string, newTTL: number): void {
        const cached = this.cache.get(key);
        if (cached) {
            cached.expiry = Date.now() + newTTL;
        }
    }
    
  2. 問題2: キャッシュのサイズが一定以上になった場合に古いデータを削除する機能を実装してください。

    
    private maxSize: number = 100; // 最大キャッシュサイズ
    private pruneCache(): void {
        if (this.cache.size > this.maxSize) {
            const keys = Array.from(this.cache.keys());
            this.cache.delete(keys[0]); // 最初の要素を削除
        }
    }
    
  3. 問題3: キャッシュから全てのデータを削除するメソッドを実装してください。

    
    clear(): void {
        this.cache.clear();
    }
    

まとめ

  • キャッシュ戦略は、パフォーマンス向上に寄与する重要な手法である。
  • TypeScriptを用いた実装は、他の言語でも適用可能な設計思想を持つ。
  • 実務での具体的なシチュエーションに基づいたキャッシュ戦略の理解が深まった。