【发布时间】:2015-08-03 17:01:38
【问题描述】:
我有一个现有的模型单例方法触发了我想对缓存建模的昂贵的数据库查询。为此,我在有问题的方法周围包裹了一个Rails.cache.fetch() 调用:
# app/models/specialist.rb
class Specialist < ActiveRecord::Base
def city
Rails.cache.fetch([self.class.name, self.id, "city"], expires_in: 23.hours) do
# expensive legacy query:
if responded?
o = offices.first
return nil if o.blank?
return o.city
elsif hospital_or_clinic_only?
(hospitals.map{ |h| h.city } + clinics.map{ |c| c.cities }).flatten.reject{ |i| i == nil }.uniq.first
elsif hospital_or_clinic_referrals_only?
(offices.map{ |o| o.city } + hospitals.map{ |h| h.city } + clinics.map{ |c| c.cities }).flatten.reject{ |c| c.blank? }.uniq.first
else
nil
end
end
end
end
在过去的所有记录上执行.city 需要 16 秒;有了这个Rails.cache.fetch 块,它只下降到 7 秒,因为一半的记录仍在触发数据库调用。
当我进行调查时,我发现当city 方法返回nil 时,Rails.cache 不会将结果写入内存缓存——这意味着我的一半专家记录尽管被“缓存”了,但仍会触发昂贵的数据库查找
如何在使用 memcache 时强制 Rails.cache.fetch 存储 nil 的值,以免触发另一个数据库查找再次查找 nil?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 caching null memcached