ここに全部かいてあった
1.7 低レベルキャッシュ - Rails のキャッシュ機構 - Railsガイド
なにかを計算した結果とか、ActiveRecordをまるっと(RailsガイドによるとActiveRecordオブジェクトのインスタンスのキャッシュは避けること、とあるけれど、キャッシュキーにobject_idを含めれば問題がなくなる、かな…?)とか、APIリクエストの結果とか、そういうときにRails.cache.fetchが使えるのだけど、このとき、適当にキーを生成するのではなく、cache_key
とか cache_key_with_version
といったメソッドがActiveRecordにあり、これを使うことで、値をよしなに生成してくれる。
これを使うことでのメリットは、ActiveRecordからの結果をキャッシュしたい、みたいなときにデータが更新されることによるinvalidateをあんまり気にしなくていい、というのがある。
逆にActiveRecordが更新されるときにはキャッシュが使えなくなる。例えば、親子関係のあるモデルで、子が更新されたときに親をtouchしたい、みたいな場合。親のデータは何ひとつ変わってないけど、親のデータに基づくキャッシュは、親のupdated_atが更新されるために利用できなくなる。
キャッシュヒット率をとことんあげようとしたり、メモリをエコに使おうとするならこのままではちょっと不都合になる。
例えば、キャッシュをプライマリキーで生成し、after_save
と after_destory
でフックして、更新されたカラムを見てキャッシュを消すあるいは更新する、というアプローチにすると、最適化できる。とはいえちょっと面倒ではある。。。もしかしたらこういうふうに便利に使えるgemがあるかもしれないけれど、そこまで最適化しようとするのは大変で地道なので、愚直にやっていくほうがいいんじゃないだろうか。