マストドンはRDBのリードが多いのでキャッシュするようになっているようだ。CacheConcern
で実装している。
キャッシュ戦略は以下の通り。
- (1) なんらかのコレクションをすべてキャッシュする
- (2) 同じキーに対するリクエストのjsonレスポンスをまるごと3分間キャッシュする
(1) コレクションをすべてキャッシュする
cache_collection
によってトゥートゥはすべてフラグメントキャッシュに入れている。
この実装によってコレクションを構成する要素毎のキャッシュキーに必要なクエリは問い合わせているが、N+1クエリ対策の先読みクエリ分を節約できている。
Rails.cache.read_multi
を使っているのでオーバーヘッドはい小さそう。
(2) 同じキーにでレスポンスをまるごと3分間キャッシュする
render_with_cache
でレスポンスを書いてあげると3分間フラグメントキャッシュに入れてくれる。
タイトルの通りなので特に情報はないんですけど、トゥートゥが更新されないからできる実装だと思う。
まとめ
コレクションの中身を1つずつフラグメントキャッシュに書き込んで、読み込み時には先読みコストを減らし、レスポンスを3分間キャッシュしている。