導入
キャッシュ戦略は、アプリケーションのパフォーマンス向上に不可欠な要素です。特にデータベースや外部APIからのデータ取得が多いシステムでは、キャッシュを適切に利用することで、レスポンス時間を大幅に短縮できます。本記事では、TypeScriptを用いた具体的なキャッシュ戦略の実装例を紹介し、実務に役立つ知識を深めていきます。
教科書レベルの解説(キャッシュ戦略)
重要な概念の整理
キャッシュ戦略には、メモリキャッシュやディスクキャッシュなど様々な手法があります。ここでは、メモリキャッシュを中心に解説します。メモリキャッシュは、データをメモリ上に保持することで、頻繁にアクセスされるデータに対する取得コストを削減します。ただし、メモリは有限であるため、キャッシュのサイズ管理やエビクションポリシー(古いデータをどのように削除するか)が重要なポイントとなります。
コード例(TypeScript)
class Cache {
private cache: Map = new Map();
get(key: string): T | undefined {
return this.cache.get(key);
}
set(key: string, value: T): void {
this.cache.set(key, value);
}
clear(): void {
this.cache.clear();
}
size(): number {
return this.cache.size;
}
}
// 使用例
const apiCache = new Cache();
apiCache.set('user_1', { name: 'Alice', age: 30 });
const user = apiCache.get('user_1');
console.log(user); // { name: 'Alice', age: 30 }
コードの行ごとの解説
- class Cache<T> { – ジェネリック型を使用したキャッシュクラスの定義。
- private cache: Map<string, T> = new Map(); – キーと値のペアを保持するためのMapを初期化。
- get(key: string): T | undefined { – 指定されたキーに対する値を取得するメソッド。
- set(key: string, value: T): void { – キャッシュに新しいキーと値を追加するメソッド。
- clear(): void { – キャッシュをクリアするメソッド。
- size(): number { – 現在のキャッシュのサイズを返すメソッド。
- const apiCache = new Cache<any>(); – キャッシュのインスタンスを作成。
- apiCache.set(‘user_1’, { name: ‘Alice’, age: 30 }); – ユーザー情報をキャッシュに保存。
- const user = apiCache.get(‘user_1’); – キャッシュからユーザー情報を取得。
- console.log(user); – 取得したユーザー情報をコンソールに出力。
練習問題編
以下にキャッシュ戦略に関する練習問題を用意しました。各問題に対する模範解答も併せて記載します。
-
問題1: キャッシュクラスにエビクションポリシーを追加する方法を考え、LRU(Least Recently Used)を実装してみてください。
// LRUキャッシュの実装例 class LRUCache{ // 実装内容は省略 } -
問題2: キャッシュのサイズが一定の制限を超えた場合、どのようにデータを削除するのが効果的か考えてください。
// サイズ制限に基づく削除ロジックの実装例 if (this.size() > LIMIT) { // 古いデータを削除 } -
問題3: APIからのデータ取得時に、キャッシュが存在しない場合の処理を実装してください。
// API呼び出しとキャッシュ処理の例 const fetchData = async (key: string) => { const cachedData = apiCache.get(key); if (cachedData) { return cachedData; } const data = await apiCall(key); apiCache.set(key, data); return data; };
まとめ
- キャッシュ戦略は、システムのパフォーマンスを向上させる重要な手法である。
- メモリキャッシュの実装には、データの取得や保存、サイズ管理が含まれる。
- エビクションポリシーの実装を通じて、効率的なキャッシュ管理が可能となる。