7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Qiita株式会社Advent Calendar 2023

Day 2

Railsのキャッシュがいつ切れるかを確認したい

Last updated at Posted at 2023-11-22

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

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?