キャッシュは安易に使用するべきではないという話
「キャッシュはとりあえず使えば良いもの」と間違った理解をしていた僕は、データ取得時にとりあえずキャッシュを使用していたことがあります。
しかし、いつも通りキャッシュを適用してコードを書いていたある日、先輩エンジニアからこんなレビューを受けました。
ここをキャッシュするメリットって何かある?
キャッシュは管理コストが高くなるので、トレードオフを考えて慎重に検討して欲しい。
これをきっかけに、キャッシュを使用することのメリットとデメリットについて学んだので、今回は自分と同じように考えていた人に向けて、キャッシュの簡単な説明から、メリットとデメリットについてまとめました。
キャッシュとは
キャッシュとは、データを高速で返すことができる一時的なストレージです。
Redisやmemcachedなとが代表例かと思います。
通常webアプリケーションであれば、クライアントからサーバーにリクエストを送り、サーバーからDBへアクセスしてデータを取得して、DB → サーバー → クライアントとデータを返していきます。
ただ、キャッシュを利用すると、サーバーとDBの間にキャッシュが挟まり、キャッシュにデータがあればDBにアクセスしなくても、キャッシュからデータを返却できるようになります。
キャッシュは高速にデータを返す仕組みであるため、DBにクエリを投げてデータを取得するよりも速くデータを返すことができます。
今回の例ではwebアプリケーションを使用しましたが、キャッシュには色々なレイヤーがあります。
- ブラウザのキャッシュ
- HTTPのキャッシュ
- CDNのキャッシュ
- etc
僕もあまり詳しくはないですが、キャシュを使用することで、メインストレージにアクセスするよりも、高速にデータの返却が可能になるという基本的な仕組みはどれも同じはずです。
ここからのメリットとデメリットについても、基本webアプリケーションレイヤーで説明していきます。
キャッシュのメリットとデメリット
これだけ見ると、パフォーマンスの改善においてキャッシュを使用することはとても良いように見えます。
確かにキャッシュは正しく使えれば、大きなメリットがありますが、逆にデメリットも多くあります。
メリット
- ユーザー体験が良くなる
- DBに高負荷がかかる処理の数を減らせる
- 大量リクエストによるDBへの負荷を避けられる
ユーザー体験が良くなる
単純に高速でレスポンスを返すことができるため、ユーザーの待ち時間が減り、ユーザー体験が向上します。
DBに高負荷がかかる処理の数を減らせる
Slow QueryなどのDBに高負荷がかかる処理も、キャッシュを使用することでクエリを発行せずにデータを返すことができるため、高負荷でDBがダウンしてしまうリスクを避けることができます。
大量リクエストによるDBへの負荷を避けられる
一つのリクエストの負荷で見れば軽いものでも、大量のリクエストがあれば処理しきれずダウンしてしまうことはあると思います。
これもキャッシュを使用すると、DBへのリクエストを避けることができるので、回避することができます。
デメリット
- キャッシュとメインストレージの整合性を保つ必要がある
- キャッシュが壊れたときに、データが消える可能性がある
- 障害要因が増える
- デバッグがしづらい
キャッシュとメインストレージの整合性を保つ必要がある
キャッシュは、あくまでもメインストレージのデータを保存して管理しています。
そのため、メインストレージのデータに変更が合った場合、キャッシュのデータも書き換える必要があります。
また、データの書き換えが上手くできなかった場合、古いデータをクライアントに返してしまうことになります。
障害要因が増える
単純に管理すべき場所が1つ増えるため、障害要因が増えます。
データが消える可能性がある
キャッシュは一時的なストレージなため、キャッシュサーバを再起動したり、キャッシュの有効期限が切れたりすると、キャッシュからデータは消えてしまいます。
そのため、キャッシュは再構築可能なものだけを保存するようにしないといけません。
キャッシュの管理方法によっては、キャッシュにある程度データを保存してから、まとめてメインストレージに保存する方法もあるようです。
再構築不可能なデータをキャッシュにだけ入っている状態のときに、キャッシュサーバーが壊れてしまうとデータはなくなってしまいます。
デバッグがしづらい
単純にキャッシュを使用すると変数が増えるため、不具合が起きたときに考慮すべきことが増えて大変になります。
- キャッシュに保存しているデータなのかどうか
- 整合性が取れているかどうか
- キャッシュで不具合が起きているのかどうか
まとめ
まとめると、キャッシュを使用するメリットは大きくあるが、同様にデメリットも大きくあるため、デメリットをメリットが上回ると判断できるときにだけ、使用すべきということですね。
これが最初に出てきたレビューの内容なのだと思います。
キャッシュは管理コストが高くなるので、トレードオフを考えて慎重に検討して欲しい。
今回この記事を書くにあたって、キャッシュについて改めて調べましたが、やはりキャッシュの使用は最終手段として、キャッシュを使わないで済むなら使うべきでないという内容も多くありました。
今回はキャッシュ戦略については全く書けなかったので、キャッシュ戦略について学びが深まったら、また記事にしようと思います。