【エルアールユーキャッシュ】

LRUキャッシュ とは?

💡 使ってないものから順に片づける、お部屋のお掃除ルール
📌 このページのポイント
LRUキャッシュの仕組み ← 最近使った           古い → A (最新) B C D E (最古) ① Cにアクセス ← 最近使った           古い → C (最新) A B D E (最古) ② 容量超過 → E を追い出し ※ ハッシュマップ + 双方向連結リストで O(1) アクセス
LRUキャッシュのイメージ
ひよこ ひよこ

LRUキャッシュって何?キャッシュのお片づけルールみたいなもの?

ペンギン先生 ペンギン先生

まさにそのとおり!キャッシュの容量には限りがあるから、いっぱいになったときに「一番長いこと使ってないデータ」を捨てるルールだよ。冷蔵庫の中身を整理するとき、一番古くて手をつけてない食材から処分するのと同じだね。

ひよこ ひよこ

じゃあ最近使ったデータは残るってこと?

ペンギン先生 ペンギン先生

そう!アクセスされるたびにそのデータは「最近使った」として先頭に移動するんだ。だから常に末尾にいるデータが一番長く触られてない、追い出し候補ってわけだね。

ひよこ ひよこ

実装ってどうやるの?配列で管理するのかな?

ペンギン先生 ペンギン先生

定番の実装はハッシュマップと双方向連結リストの組み合わせだよ。ハッシュマップでO(1)の高速検索を実現して、連結リストで順序を管理する。アクセスされたノードをリストの先頭に移動させるだけだから、挿入も削除もO(1)で済むんだ。

ひよこ ひよこ

LRU以外のキャッシュ戦略ってあるの?

ペンギン先生 ペンギン先生

あるよ!LFU(Least Frequently Used)は使用頻度が一番低いものを追い出す方式。FIFO(First In, First Out)は入った順番に追い出す。あとARC(Adaptive Replacement Cache)は最近使った頻度と回数を両方考慮する賢いやつだね。

ひよこ ひよこ

面接でLRUキャッシュを実装しろって出るって聞いたけど、本当?

ペンギン先生 ペンギン先生

有名な話だね。LeetCodeの「LRU Cache」は定番中の定番で、計算量O(1)で get と put を実装する問題だよ。データ構造の理解度を見るのにちょうどいいから、面接で頻出なんだ。

ひよこ ひよこ

実際のシステムだと、どんなところで使われてるの?

ペンギン先生 ペンギン先生

Linux のページキャッシュ、CPU の L1/L2 キャッシュの置換ポリシー、Redis の maxmemory-policy、CDN のコンテンツキャッシュなど、至るところで使われているよ。Webブラウザがページをキャッシュする仕組みにもLRUの考え方が入っていたりするね。知っておくとシステム設計の議論がスムーズになるよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「LRUキャッシュ」って出てきたら「最近使ってないデータから消すキャッシュ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Least Recently Used Cache」 = 最も最近使われていないキャッシュ
💬 Least Recently Used、つまり「一番長く放置されてるやつ」を追い出すルールだよ
← 用語集にもどる