TypeScript中級

中級 TypeScriptで学ぶキャッシュ戦略|アンチパターン編

導入

キャッシュ戦略は、アプリケーションのパフォーマンスを向上させるために欠かせない手法です。しかし、実際の業務では、キャッシュを適切に管理できずに問題を引き起こすことがあります。本記事では、TypeScriptを用いたキャッシュ戦略の具体的なシチュエーションを取り上げ、ありがちな失敗例を通じてその改善方法を探ります。

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

重要な概念の整理

キャッシュは、データ取得のコストを削減するために、頻繁にアクセスされるデータを一時的に保存する仕組みです。特に、APIからのデータ取得やデータベースアクセスの際にキャッシュを活用することで、レスポンス時間を短縮し、サーバーの負荷を軽減できます。キャッシュ戦略を正しく実装することは、システムのスケーラビリティにも寄与します。

コード例(TypeScript)


class Cache {
    private cache: Map = new Map();

    get(key: string): any {
        return this.cache.get(key);
    }

    set(key: string, value: any): void {
        this.cache.set(key, value);
    }

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

const cache = new Cache();
cache.set('user_1', { name: 'Alice', age: 30 });
const user = cache.get('user_1');
console.log(user); // { name: 'Alice', age: 30 }

コードの行ごとの解説

  1. private cache: Map = new Map(); – キャッシュを保持するためのMapオブジェクトを初期化します。
  2. get(key: string): any – 指定されたキーに対するキャッシュされた値を取得します。
  3. set(key: string, value: any): void – 新しい値を指定されたキーでキャッシュに保存します。
  4. clear(): void – キャッシュを全てクリアします。
  5. const user = cache.get('user_1'); – ‘user_1’というキーでキャッシュからデータを取得します。

アンチパターン編

キャッシュの実装においてよく見られるアンチパターンの一つは、キャッシュの有効期限を設定せず、古いデータをそのまま保持することです。これにより、アプリケーションが不正確な情報を返す可能性が高まります。例えば、ユーザーのプロフィール情報が更新された場合でも、キャッシュが古いデータを返すことがあります。

以下は、キャッシュに有効期限を設けずに実装した場合のコード例です。


class CacheWithNoExpiry {
    private cache: Map = new Map();
    
    get(key: string): any {
        const entry = this.cache.get(key);
        return entry ? entry.value : null;
    }

    set(key: string, value: any): void {
        this.cache.set(key, { value, timestamp: Date.now() });
    }
}

この実装では、キャッシュの値がいつ設定されたかの情報を持ちません。これが問題です。解決策としては、キャッシュの有効期限を設け、期限切れのデータを自動的に削除する機能を追加することです。

まとめ

  • キャッシュ戦略は、パフォーマンス向上に寄与しますが、適切な管理が不可欠です。
  • 古いデータを保持することは、アプリケーションの信頼性を損なう要因となります。
  • キャッシュの有効期限を設けることで、データの鮮度を保つことが可能です。