在我的应用中的某个地方,我使用
Rails.cache.write 'some_key', 'some_value', expires_in: 1.week
在我的应用程序的另一部分中,我想弄清楚该缓存项目还剩多少时间。
我该怎么做?
答案 0 :(得分:6)
这不是合法的方式,但是可以:
expires_at = Rails.cache.send(:read_entry, 'my_key', {})&.expires_at
expires_at - Time.now.to_f if expires_at
read_entry
是受fetch,read,exists?和其他方法使用的受保护方法,这就是我们使用send
的原因。 / p>
如果根本没有条目,它可能会返回nil
,因此将try
与Rails一起使用,或者将&.
用于安全导航,或者将.tap{ |e| e.expires_at unless e.nil? }
用于旧红宝石。 / p>
因此,您将得到类似1587122943.7092931
的信息。这就是为什么您需要Time.now.to_f
。使用Rails,您还可以使用Time.current.to_f
。
答案 1 :(得分:2)
哇。我刚来这里寻找这个。可耻的答案是否定的。
我的解决方案,然后,我不是它的粉丝,也是缓存过期。
Rails.cache.write 'some_key', ['some_value', 1.week.from_now], expires_in: 1.week
我想这不是世界末日,除了你必须记住它被存储为一个数组。
或者,您可以使用可缓存模块稍微抽象一下该功能。那你就不必“记住”任何东西。
答案 2 :(得分:0)
这对我有用,它可以获取特定缓存键的剩余TTL(在Redis缓存存储中):
Rails.cache.redis.ttl("#{Rails.cache.options[:namespace]}:#{my_key}")