こう 聞かれます
- 「キャッシュは
どこに 置き、 どう 消しますか」 - 「記事を
直したのに、 古い 内容が 表示され続けます。 何を 疑いますか」 - 「キャッシュしてはいけない物は
ありますか」
面接官が 見ている点
- キャッシュの
置き場を、 利用者に 近い 所から 層で 並べられるか - 古い値を
消す方法を、 いく つか 持っているか - 古い値を
返して 困る 物を 見分け、 そこには 使わない 判断ができるか
短い答え
- 利用者に
近い順に、 ブラウザ、 CDN、 アプリの 中や横の 置き場、 DB の 手前、 と層で 考え、 データごとに どこまで 持たせるかを 決めます。 - 消し方は、
期限 (TTL) で 自然に 切らす、 更新した ときに 明示的に 消す、 URL に 版の 印を 付けて 別物に する、の 3 つを 使い分けます。 - 残高や
在庫のように 古い値を 返すと 困る 物は、 キャッシュしないか、 ごく 短い 期限に とどめます。
少し 詳しい答え
層で 置き場を考える
- ブラウザ 利用者の
端末に 持たせます。 いちばん速いですが、 こちらから 消しにくい置き場です - CDN 世界中の
配信の 拠点に 写しを 置き、 近い 拠点から 返します。 Cloudflare、 AWS の CloudFront、 Google Cloud の Cloud CDN などです - アプリの
中や横の置き場よく 読む DB の 結果 や外の API の 答えを、 メモリや Redis のような 速い 置き場に 持ちます。 AWS の ElastiCache、 Google Cloud の Memorystore、 Cloudflare の KV などが この 役に 使われます - DB の手前読み取り専用の
写し (リードレプリカ) や、 集計を 前もって 作っておく 表も、 広い 意味の キャッシュです
利用者に
3 つの消し方
ブラウザや CDN には、
http
Cache-Control: public, max-age=31536000, immutable
Cache-Control: private, no-store1 行目は、
- 期限 (TTL) 何秒持ってよいかを
決め、 過ぎたら 取り直させます。 単純ですが、 期限までは 古い値が出ます - 更新した
ときに消す記事を 直したら、 その 記事の キャッシュを 消す (CDN なら消す指示を 送る ) ようにします。 すぐ 反映されますが、 消し忘れる 道が あると 古いまま残ります - URL に
版の 印を付ける 上の 1 行目の やり方です。 消す必要が そもそも 無くなります
キャッシュしない 物 (トレードオフ)
キャッシュは
期限が
話すときは、
よく ある間違い
- 全部に
長い 期限を付ける 直した 内容が 出ない、と 言われます。 変わる 頻度と、 古くて 困るか どうかで 期限を分けます - 人ごとに
違う 画面を 共有の キャッシュに置く 別の 人の 情報が 見える 事故に なります。 本人だけの 応答は private か no-store にします - 残高や
在庫を キャッシュから返す古い値で 売りすぎや 使いすぎが起きます
深掘りの問い
- 「キャッシュが
どれだけ効いているかは、 どう 測りますか」 当たった 割合 (ヒット率) と、 元の サーバーへの 要求の 数や 遅さを、 足す前と 後で 比べる、と答えます - 「DB を
直したのに キャッシュに 古い値が 残る、を 防ぐには」 書き込みの 処理の 中で 同じ キーを 消す、 または 期限を 短く する、と 答え、 両方が 失敗した ときの 扱いも 決める、と添えます - 「CDN に
置いた 画像を 急いで 差し替えたいときは」 CDN に 消す指示を 送るか、 ファイル名を 変えて 新しい URL に する、と答えます