问题
Somewhere in my app I use
Rails.cache.write 'some_key', 'some_value', expires_in: 1.week
In another part of my app I want to figure out how much time it is left for that cache item.
How do I do that?
回答1:
Wow. I just came here looking for this. What a shame the answer is no.
My solution, then, which I'm not a fan of, is to cache the expiration as well.
Rails.cache.write 'some_key', ['some_value', 1.week.from_now], expires_in: 1.week
I suppose it's not the end of the world, except that you have to remember it was stored as an array.
Alternatively you could abstract the functionality a little with a cacheable module. Then you don't have to "remember" anything.
回答2:
This is not a legal way, but it works:
expires_at = Rails.cache.send(:read_entry, 'my_key', {})&.expires_at
expires_at - Time.now.to_f if expires_at
read_entry is protected method that is used by fetch, read, exists? and other methods under the hood, that's why we use send.
It may return nil if there is no entry at all, so use try with Rails, or &. for safe navigation, or .tap{ |e| e.expires_at unless e.nil? } for old rubies.
As a result you will get something like 1587122943.7092931. That's why you need Time.now.to_f. With Rails you can use Time.current.to_f as well.
来源:https://stackoverflow.com/questions/39868775/get-expiration-time-of-rails-cached-item