導入
キャッシュ戦略は、パフォーマンスを向上させるための重要な手法です。特に、データ取得の頻度が高い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'
コードの行ごとの解説
- class Cache<T> { – ジェネリック型を使用して、様々な型のデータをキャッシュできるクラスを定義。
- private cache: Map<string, { value: T; expiry: number }> = new Map(); – キャッシュのデータを保持するためのMapを初期化。
- constructor(private ttl: number) {} – コンストラクタで、キャッシュの有効期限を設定。
- set(key: string, value: T): void { – キャッシュにデータを追加するメソッド。
- const expiry = Date.now() + this.ttl; – データの有効期限を計算。
- get(key: string): T | null { – キャッシュからデータを取得するメソッド。
- if (!cached) return null; – キャッシュが存在しない場合はnullを返す。
- if (Date.now() > cached.expiry) { – キャッシュが期限切れの場合の処理。
練習問題編
以下に、キャッシュ戦略に関連する練習問題を用意しました。各問題に対する模範解答と解説も記載しています。
-
問題1: キャッシュの有効期限を動的に変更するメソッドをCacheクラスに追加してください。
updateTTL(key: string, newTTL: number): void { const cached = this.cache.get(key); if (cached) { cached.expiry = Date.now() + newTTL; } } -
問題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: キャッシュから全てのデータを削除するメソッドを実装してください。
clear(): void { this.cache.clear(); }
まとめ
- キャッシュ戦略は、パフォーマンス向上に寄与する重要な手法である。
- TypeScriptを用いた実装は、他の言語でも適用可能な設計思想を持つ。
- 実務での具体的なシチュエーションに基づいたキャッシュ戦略の理解が深まった。