我希望将对象保留在Rails缓存中,只要在某个时间间隔(例如10分钟)内有读取。我可以使用以下命令在缓存对象创建上成功设置TTL:
Rails.cache.fetch('key', expires_in: 10.minutes) do
some_expensive_operation
end
但是我注意到'key'的后续缓存读取没有达到TTL(至少在我的设置中没有,这是Rails 3.2 + Redis)。
有没有办法让Rails.cache.{fetch,read}
重新启动缓存命中的TTL?
我的另一种选择是做以下事情,这似乎有些浪费:
result = Rails.cache.read('key') || some_expensive_operation
Rails.cache.write('key', result, expires_in: 10.minutes)
答案 0 :(得分:0)
这是我提出的特定于redis的解决方案:
def fetch(key, ttl_seconds)
cached_value = $redis.get(key)
if cached_value
# re-up the TTL
$redis.expire(key, ttl_seconds)
result = Marshal.load(cached_value)
else
result = yield
$redis.setex(key, ttl_seconds, Marshal.dump(result))
end
result
end
fetch('key', 10.minutes) do
some_expensive_operation
end
我更喜欢缓存提供商中立的东西,但这似乎不是Rails缓存API的一部分,除非我错过了什么。
答案 1 :(得分:0)
据我所知,你想在fetch上更新TTL只是为了让缓存只存储经常使用的记录。我想原因是缓存大小。
不要那样做!让缓存引擎决定要保留哪些记录。如果你正在使用 Memcached ,它可以开箱即用,你就永远无法删除旧记录。如果您使用 Redis ,则需要configure it as an LRU cache。