加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Memcached总是错过(rails)

发布时间:2020-12-17 03:09:35 所属栏目:百科 来源:网络整理
导读:嗨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
嗨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

解决方法

用信息替换退货信息.

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

return关键字总是从当前方法返回,这意味着信息永远不会返回到您对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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读