Railsには重いクエリの結果や外部から取得したデータを一時的に保存するために、cache機能が用意されています。
たとえば以下のように記述することで、キャッシュストアのhoge
キーに値が入っていればキャッシュストアの値を利用し、なければブロック内の処理を実行し、ブロックの返り値をキャッシュストアに保存する処理を行います。
Rails.cache.fetch('hoge', expires_in: 12.hours) do
# 保存したい値が返るように記述する
end
いつキャッシュが切れるか見たい
さて、上記のサンプルコードのようにexpires_in
でキャッシュの時間を指定できるというのは有名ですが、今回は逆にキャッシュが切れる時刻を確認したいケースです。
キャッシュが切れる時刻を取得にするためには、以下のコードのようにRails.cache.read_entry
を利用します。
# キーに値が入ってない場合nilが返るため、expires_atの前に `&`を書いている。
Rails.cache.send(:read_entry, '取りたいキー')&.expires_at
=> 1700665200.3722553
irb(main):007:0> Time.at(expires_at)
=> 2023-11-22 15:00:00 195169/524288 +0000
read_entryはprivateメソッドであるため、sendを使ってread_entryを呼び出しています。
このメソッドはキャッシュストアから取ってきたデータを、ActiveSupport::Cache::Entry というクラスに変換をしています。
ActiveSupport::Cache::Entryには.expires_at
というメソッドが定義されており、このメソッドを呼び出すことでキャッシュが切れる時間をUnixTimeで保存することができます。
あとはTime.at
などで変換をしてあげると、いつキャッシュが切れるのか確認しやすくなるでしょう。
REF
https://github.com/rails/rails/blob/23938052acd773fa24068debe56cd892cbf8d868/activesupport/lib/active_support/cache/redis_cache_store.rb#L310
https://github.com/rails/rails/blob/f78cb5583f77952aa35e063a660a11aad5f8de7f/activesupport/lib/active_support/cache.rb#L614
https://github.com/rails/rails/issues/45311