Memcached总是想念(rails)

时间:2010-09-03 14:46:38

标签: ruby-on-rails ruby memcached

嗨Stackoverflowers,我在这个问题上花了太多时间来保持理智,所以是时候寻求帮助......

我有一个使用此方法的课程:

def telecom_info

    Rails.cache.fetch("telecom_info_for_#{ref_num}", :expires_in=> 3.hours) do
      info = Hash.new(0)
      Telecom::SERVICES.each do |source|
          results = TelecomUsage.find(:all, 
                                      :joins=>[:telecom_invoice=>{ :person=> :org_person}], 
                                      :conditions=>"dotted_ids like '%#{ref_num}%' and telecom_usages.ruby_type = '#{source}'", 
                                      :select=>"avg(charge) #{source.upcase}_AVG_CHARGE,
                                                max(charge) #{source.upcase}_MAX_CHARGE,
                                                min(charge) #{source.upcase}_MIN_CHARGE,
                                                sum(charge) #{source.upcase}_CHARGE,

                                                avg(volume) #{source.upcase}_AVG_VOLUME,
                                                max(volume) #{source.upcase}_MAX_VOLUME,
                                                min(volume) #{source.upcase}_MIN_VOLUME,
                                                sum(volume) #{source.upcase}_VOLUME
                                                ")

          results = results.first
          ['charge', 'volume'].each do |source_type|                                        
            info["#{source}_#{source_type}".to_sym] = results.send("#{source}_#{source_type}".downcase).to_i
            info["#{source}_min_#{source_type}".to_sym] = results.send("#{source}_min_#{source_type}".downcase).to_i
            info["#{source}_max_#{source_type}".to_sym] = results.send("#{source}_max_#{source_type}".downcase).to_i
            info["#{source}_avg_#{source_type}".to_sym] = results.send("#{source}_avg_#{source_type}".downcase).to_i
          end
      end

      return info
    end
end

正如您所看到的,这是一个昂贵的调用,每个请求都会调用ALOT,因此我想缓存它。问题是memcached似乎不起作用,在日志文件中,我得到:

缓存读取:telecom_info_for_60000000

缓存未命中:telecom_info_for_60000000({})

奇怪的是,我知道memcached正在工作,因为它确实缓存了我在另一个模型中的其他一些函数的结果。

有什么建议吗?我在REE 1.8.7上运行Rails 2.3.5

1 个答案:

答案 0 :(得分:7)

return info替换为info

Rails.cache.fetch("telecom_info_for_#{ref_num}", :expires_in=> 3.hours) do
  # ...
  info
end

return关键字始终从当前的方法返回,这意味着info永远不会返回到您对Rails.cache.fetch的调用,其余的该方法曾执行过。当最后一个语句只是info时,这是将赋予Rails.cache.fetch的值,并且您将允许该方法通过将此值存储在缓存中来完成其任务。

比较以下内容:

def my_method
  1.upto(3) do |i|
    # Calling return immediately causes Ruby to exit the current method.
    return i
  end
end

my_method
#=> 1

根据经验:除非你真的想要退出当前块并从当前方法返回,否则总是省略return