Redisキャッシュの利用方法に関する詳細情報

こんにちは!

Discourse インスタンスで負荷テストを行っているところ、同じコメントスレッドを繰り返し取得し続けると、Redis のキャッシュヒット率が上がるどころか低下することに気づきました。これは少し意外でした(読み書きが混在する場合は最大 85% のキャッシュヒット率でしたが、読み取り 100% の場合は最低 22% まで低下しました)。

コードベースやこちらのフォーラムでいくつか検索してみたのですが、Redis キャッシュがどのように活用されているのか、いまいち明確ではありません。README には以下のように記載されています。

Redis をキャッシュおよび一時的なデータの保存に使用しています。

上記の負荷テスト中に Redis に送信されたコマンドを redis-cli でダンプしてみたところ、主にスケジューリングされたジョブや「\_\mb_backlog_id_n」というプレフィックスを持つキーに対する「get」コマンドが見られました(これは MessageBus 関連を指していると思います)。

以下の点について質問させてください。

  • コードベース内で、どのデータが Redis にキャッシュされているかを検索する「簡単な」方法はありますか?これらの質問に自分で答えたいのですが、残念ながら Ruby on Rails アプリケーション(いや、Ruby 自体)にはあまり詳しくないのです :slight_smile:
  • ログイン状態かログアウト状態かによって、キャッシュヒット率は影響を受けますか?参考までに、上記の負荷テストは管理者 API キーを使用して行いました。
  • 投稿の内容のように、頻繁にクエリされ比較的静的なデータも Redis にキャッシュされていますか?それとも、Redis は主に Sidekiq などのジョブスケジューリングやバックグラウンド処理に使用されているのでしょうか?

ご回答いただけますと幸いです!

ここが最も重要な点です。最も積極的なキャッシュは匿名リクエストに対して行われます。そのため、いくつかの匿名ボットを使って負荷テストを再実行することを推奨します。

Discourse.cache.fetchDistributedCache.new のように、grep で検索できるメソッドがいくつかあります。

あまり頻繁に変更されない設定のブロブの一部はキャッシュしていますが、トピックへのアプローチは、匿名ユーザーに対してレスポンス全体をキャッシュするというものが主です。これにより、アプリはデータベースにほとんどアクセスすることなくレスポンスを構築できます。

Redis は Sidekiq と MessageBus で非常に頻繁に使用されています。

素晴らしい、とても役立つ回答をありがとうございます!

今回、匿名リクエストで負荷テストを再実行したところ、パフォーマンスが大幅に向上しました!以前は単一ホストで秒間約 25 リクエストしか処理できませんでしたが、現在は 380 リクエストまで可能です!Redis のキャッシュヒット率も約 22% から約 66% に向上しました。:slight_smile:

もし興味のある方がいらしたらと、結果を共有しました。

お手伝いいただき、ありがとうございます!