FIG-007

LRUキャッシュ — 机からあふれた本はどれを返す?

データ構造 2026.06.12 公開 読了 約10分

キャッシュの置き場所には限りがあります。いっぱいになったら、何かを捨てて空きを作らなければなりません。では何を捨てるか? その定番の答えが LRU(Least Recently Used)— 「いちばん長く使われていないものから追い出す」です。

下の図1は、あなたの勉強机です。よく使う本は机の上(キャッシュ)に置けますが、4冊まで。それ以上は遠い本棚まで取りに行くことになります。本棚の本をクリックして、机の上がどう入れ替わるか試してください。

BOOKSHELF — 本棚(遠い・遅い)。クリックで本を使う
DESK — 机の上(キャッシュ・4冊まで)
← 最近使った(安全) 長く使ってない(次に追い出される)→
0アクセス
0ヒット(机にあった)
0ミス(本棚行き)
LOG
机の上はまだ空っぽです。本棚の本をクリックして使ってみてください。使った本は机のいちばん手前(左)に置かれます。
図1 — LRUキャッシュの勉強机(ヒット / ミス / 追い出し)

ルールは「使ったら手前に置き直す」だけ

図1のLRUがやっていることは、たった2つです。(1) 本を使ったら、机のいちばん手前に置き直す。(2) 机があふれたら、いちばん奥の本を本棚に返す。これだけで「最近使ったものは手前に、ずっと使っていないものは自然と奥に」並び、追い出すべき本を探す手間すらありません。奥の1冊を返すだけです。

この戦略が効くのは、アクセスには「最近使ったものは、近いうちにまた使われやすい」という偏り(時間的局所性)があるからです。CPUキャッシュ、OSのページ置換、Redisのmaxmemory-policy、ブラウザのキャッシュ — 至るところでLRUとその亜種が動いています。

LRUにも苦手な相手がいる

図1で A → B → C → D → E → A → B → C → D → E… と順繰りにクリックしてみてください。4冊の机に5冊を順番に使うと、次に使う本が毎回ちょうど追い出された直後になり、ヒット率0%が続きます。これがLRUの弱点で、全件を順になめるバッチ処理などで起こります。実務のシステムが「2回以上使われたものだけ守る」「アクセス頻度も見る(LFU)」といった亜種を使うのは、この弱点を補うためです。

用語ミニ辞書
ヒット / ミス
欲しいものがキャッシュにあればヒット、なくて遅い側へ取りに行けばミス。
追い出し
満杯のキャッシュから何かを捨てること。エビクション(eviction)とも呼ぶ。
時間的局所性
「最近使ったものはまた使われやすい」というアクセスの偏り。LRUの根拠。

まとめ

LRUは「使ったら手前へ、あふれたら奥から捨てる」だけの素朴なルールですが、アクセスの偏りを味方につけることで高いヒット率を出します。一方で、容量より少しだけ大きいループには全敗するという、はっきりした苦手も持っています。キャッシュのヒット率が思ったより出ないとき、「アクセスパターンとLRUの相性」を疑えるようになれば、この図は卒業です。