キャッシュ
Cache
取得済みのデータや計算結果を再利用のために保存しておく仕組みです。読み込みや計算を省けますが、速くなる程度は命中率や処理によって異なり、古い情報の扱いも設計する必要があります。
🐾 猫で例えると?
ビスコ缶のそばに座る茶トラ。もしこの缶がよく遊ぶおもちゃなら、遠くの収納へ毎回取りに行く代わりに、手の届く場所へ置いておくと早く使えます。キャッシュも、取得済みのデータなどを再利用しやすい場所へ残します。近くに置く量や、古くなったものをいつ入れ替えるかも決める必要があります。
💻 IT現場における「キャッシュ」とは?
Webサイトの表示速度やアプリの動作の軽快さは、ユーザー体験(UX)に直結します。毎回遠くのデータベース(DB)まで重いデータを取りに行っていては、表示に何秒もかかってしまいます。そこで現場では、「ブラウザキャッシュ(クライアント側)」や「Redisなどのインメモリキャッシュ(サーバー側)」、さらには「CDN(コンテンツ配信ネットワーク)」など、様々な階層にキャッシュを配置して爆速レスポンスを実現しています。
⚠️ キャッシュの仕組みと注意点
元データが変わった際は、キャッシュの削除・更新・期限切れなどで整合性を保ちます。ブラウザの再読み込みで解消できるのは一部のキャッシュだけで、サーバーやCDNの古いデータには別の対処が必要です。
キャッシュの寿命(TTL)の設計
TTLはキャッシュを再利用する期間を決める方法の一つです。許容できる古さを考え、価格や権限など即時反映が重要な値は更新時の無効化も検討します。期限が同時に切れると元のDBへ要求が集中することもあります。
// Redis(インメモリKVS)を使ったキャッシュ取得の疑似コード例
async function getUserProfile(userId) {
// 1. まず手元のキャッシュ(Redis)を見に行く
const cachedData = await redis.get(`user_profile:${userId}`);
if (cachedData) {
return JSON.parse(cachedData); // キャッシュがあれば爆速で返す(キャッシュヒット)
}
// 2. キャッシュが無ければ、重い処理でDBから取得(キャッシュミス)
const dbData = await database.query("SELECT * FROM users WHERE id = ?", [userId]);
// 3. 次回のためにキャッシュに保存(有効期限を1時間=3600秒に設定)
await redis.setex(`user_profile:${userId}`, 3600, JSON.stringify(dbData));
return dbData;
} この疑似コードはCache-Asideというパターンです。実際のredis・databaseのAPIや返却形式に合わせて実装し、プロフィール更新時の無効化と、キャッシュ障害時の動作を決めます。キャッシュを返す前にも閲覧権限を確認し、別利用者の情報を共有しないキー設計が必要です。
🛠️ キャッシュを賢く使うためのポイント
キャッシュを使いこなすことは、システム全体のパフォーマンスと安定性を守る上で極めて重要です。
- 適切な有効期限(TTL)を設定する: データの更新頻度に合わせて寿命を決め、古い情報が表示され続ける事故を防ぐ。
- キャッシュクリアの仕組みを用意する: 管理画面などから、任意のタイミングで古いキャッシュを強制的に破棄(パージ)できる手段を必ず実装する。
- 溜め込みすぎ(メモリ枯渇)に注意する: なんでもかんでもキャッシュするとサーバーのメモリがパンクします。アクセス頻度の高い重要なデータに絞って保存する。
手元のビスコ缶のように、キャッシュは取りに戻る手間を減らします。ただし、元のデータが変わったときにいつ反映するかを決める必要があります。更新が画面に出ないときは、どこにキャッシュがあり、有効期限や削除の条件がどうなっているかを確認しましょう。