【问题标题】:Rails: Invalidate cache based on query resultsRails:根据查询结果使缓存无效
【发布时间】:2014-12-21 12:04:10
【问题描述】:

我的 Rails 应用程序中的查询运行时间不长(约 180 毫秒),但确实返回了很多结果。结果在 API 中使用,结果到 JSON 的转换很昂贵(约 3 秒)。为了加快速度,我像这样缓存它:

key = 'new_prices'
query = Prices.new_this_month.where('...')
json = cache(key, expires_in: 60.minutes) do
  render_to_string json: query, each_serializer: PriceSerializer
end
render json: json

在后台,可以将新价格添加到数据库中。如何生成缓存键,如果query的结果发生变化,缓存就会失效?

我正在使用 Rails 3.2,通过 dalli gem 使用 memcached。

【问题讨论】:

    标签: ruby-on-rails activerecord memcached dalli


    【解决方案1】:

    因为你有一个new_this_month 范围,我假设Prices 有一个created_at 时间戳。在这种情况下,您只需在缓存键中使用最新的created_at

    cache_key = "new_prices-#{Prices.order('created_at DESC').take.created_at}"
    

    如果您有一个良好的数据库索引,这应该是一个非常快速的查询。

    【讨论】:

    • 它实际上没有created_at 日期,但可以推断出一个。我还认为如果价格发生变化,缓存不会失效是对的吗? (我没有modified_at
    • 是的,假设是正确的。不过,您没有在问题中提到这一点。确实需要一种方法来确定自上次缓存片段以来价格是否已更新。否则,您唯一的选择是手动使缓存无效。
    猜你喜欢
    • 2011-10-19
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多