全体のイメージができるようなシンプルなアプリケーションであれば、データはWHERE-INでとったり、JOINしたりすればいいと思うけれど、開発を積み重ねていくとどんどん複雑になっていって、あっちもこっちもデータを取って出したい、をあっちのクラスでもこっちのクラスでも、実は同じデータです、みたいなことが起きてくる。こういった部分に対してリクエストベースのキャッシュをもっと使いまくってもいいんじゃないか?という。
リクエストベースでリセットされるグローバル変数、というイメージ。そんなグローバル変数をもりもり使わなくちゃいけないような状況になっている時点で、クラス設計おかしいんじゃ??と言われたらそれはそうなのだけど・・・
でも多分、魔法が使えるような言語・フレームワーク(主にRuby, Railsを指しています)であれば、強く意識して実装する(あるいは型安全に実装をする)ようなことをしない限り、同じクエリがあちこちで発生して、なんか遅いんだよな〜が容易に起こるんじゃないだろうか。ActiveRecordも中でキャッシュを持っているとはいえ、インスタンスが変われば再度取得してしまう。
肝心の実装は、Goであれば、おおよそどんな実装でもリクエストごとにcontext.Contextが別れているはずなので、ここに色々なデータを詰める。Ruby on Railsならrequest_storeのgemを入れて使う。Redisだとかmemcacheだとかに入れるより、通信が発生せずメモリ上だけでできるので出し入れも速い。
1リクエストの処理中に値が変わらないようなものは、何も考えずにキャッシュできるし、積極的に使うといいんじゃないだろうか。メモリかつかつマシンを使うことも昨今は少ない…?逆にk8sとかコンテナランナーとかFaaSが流行っていてメモリかつかつか…?いやでも同じデータを取り直す時点で使うメモリ総量はいっしょだし気にしなくていいんじゃないかな。
そういえば先日のISUCON13でそんな内容もあったなあ: ISUCON13参加した