Ruby on rails 在没有多个后续查询的情况下设置集合缓存键
我刚开始为我的应用程序缓存,有点卡住了。我有一个依赖于作用域的查询。范围收集在页面上创建的最后(x)篇文章Ruby on rails 在没有多个后续查询的情况下设置集合缓存键,ruby-on-rails,caching,Ruby On Rails,Caching,我刚开始为我的应用程序缓存,有点卡住了。我有一个依赖于作用域的查询。范围收集在页面上创建的最后(x)篇文章 Rails.cache.fetch('homepage/posts') do posts = Post.by_latest render json: posts end 这是我很难理解的。因为我想确保网站显示最新的帖子,所以我不想手动设置过期时间或日期。相反,我希望在创建或销毁新帖子时使缓存过期。这是另一个困境。我曾想过在我的Post模型中进行回调,但当我想使其他键的缓存过期,
Rails.cache.fetch('homepage/posts') do
posts = Post.by_latest
render json: posts
end
这是我很难理解的。因为我想确保网站显示最新的帖子,所以我不想手动设置过期时间或日期。相反,我希望在创建或销毁新帖子时使缓存过期。这是另一个困境。我曾想过在我的Post模型中进行回调,但当我想使其他键的缓存过期,但所有键都想完成相同的事情时,事情变得有点混乱
def flush_cache
Rails.cache.delete('homepage/posts')
Rails.cache.delete('posts')
...
end
我想以更动态的方式刷新缓存,就像使用单个对象一样…其中缓存键由对象的updated_at
属性组成,并在每次修改时过期。但我发现收藏很难做到这一点。从查询生成缓存键将导致查询本身,从而破坏缓存的总体目的:
Rails.cache.fetch(Post.by_latest.cache_key) do
posts = Post.by_latest
render json: posts
end
任何帮助都将不胜感激 我认为您使用它的方式不太正确,Rails可以很好地自动处理集合的缓存 这是缓存集合的标准设置
posts = Rails.cache.fetch(Post.by_latest) do
Post.by_latest
end
render json: posts
明白了。谢谢我在实验中注意到一件事。我在查询中添加了一个
limit
,每次请求都会触发一个db查询。你知道为什么会这样吗?这是一个查询:(11.4ms)选择COUNT(*)作为“size”,MAX(用于缓存键的subquery\u.updated\u at)作为时间戳从(选择“albums”。“updated\u at”从“albums”按“albums”排序。“release\u date”DESC LIMIT$1)子查询\u用于缓存键[[“LIMIT”,24]]
@CarlEdwards您看到的这个查询是Rails检查是否需要更新缓存,它基本上是检查集合中最新的updated\u时间戳,以查看是否有新的或更新的记录。