gpt4 book ai didi

ruby-on-rails - 使用 Rails.cache.fetch 混淆缓存 Active Record 查询

转载 作者:行者123 更新时间:2023-12-03 21:36:14 24 4
gpt4 key购买 nike

我的版本是:

  • rails :3.2.6
  • 达利:2.1.0

  • 我的环境是:
  • config.action_controller.perform_caching = true
  • config.cache_store = :dalli_store, 'localhost:11211', {:namespace => 'MyNameSpace'}

  • 当我写:
     Rails.cache.fetch(key) do
    User.where('status = 1').limit(1000)
    end

    无法缓存用户模型。如果我使用
     Rails.cache.fetch(key) do
    User.all
    end

    它可以被缓存。如何缓存查询结果?

    最佳答案

    原因是因为

    User.where('status = 1').limit(1000)

    返回 ActiveRecord::Relation这实际上是一个范围,而不是一个查询。 Rails 缓存范围。

    如果要缓存查询,需要在最后使用查询方法,如 #all .
    Rails.cache.fetch(key) do
    User.where('status = 1').limit(1000).all
    end

    请注意 缓存 ActiveRecord 对象从来都不是一个好主意 .缓存对象可能会导致不一致的状态和值。如果适用,您应该始终缓存原始对象。在这种情况下,请考虑缓存 id。
    ids = Rails.cache.fetch(key) do
    User.where('status = 1').limit(1000).pluck(:id)
    end
    User.find(ids)

    您可能会争辩说,在这种情况下调用 User.find它总是被执行。确实如此,但是使用主键的查询速度很快,并且您可以解决我之前描述的问题。此外,缓存事件记录对象可能会很昂贵,并且您可能很快就会用一个缓存条目填满所有 Memcached 内存。缓存 id 也可以防止这个问题。

    关于ruby-on-rails - 使用 Rails.cache.fetch 混淆缓存 Active Record 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35535361/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com