当缓存命中Dalli时,如何防止奇怪插入:@new_record?

时间:2013-08-28 22:14:52

标签: ruby-on-rails caching heroku dalli

我正在使用Dalli和Memcachier在Heroku上实现缓存,当我获得缓存命中时,它会向返回的数组添加一个Symbol(或者在另一个示例中使用hash)。这个符号,:@ new_record,我知道没有关于我返回的结果,插入到不同类型的缓存提取中,并且我无法在SO / Google上找到此问题。代码库范围的查找不返回“new_record”的结果。

这个添加发生在我试图添加缓存的两个地方。我不知道如何防止它首先发生,但是我通过检查返回集合中每条记录的类来避免它在特定用途中的影响,如果它不是供应商,则不会呈现供应商的资料。这是一个丑陋的解决方案,我想从源头解决问题。

如果您有任何其他问题,请告诉我/需要我发布更多信息,并感谢您的帮助。


我正在使用缓存的方法:

  #this will be slow, need to store it somewhere
  def self.set_for_index(index_name)
    guide = INDEX_HOLDER[index_name]
    return false if guide.nil?
    haves, have_nots, countries = guide[0], guide[1], guide[2]
    holder = []
    supplier_set = Rails.cache.fetch("set_for_index_#{index_name}", :expires_in => 24.hours) {
      Supplier.find_each do |s|
        if (
            s.profile_visible and
            (countries == [] or (s.address and countries.include?(s.address.country))) and
            !(haves.map{ |h| s.has_tag?(Tag.find_by_name(h).id) }.include?(false)) and
            !(have_nots.map{ |h| s.has_tag?(Tag.find_by_name(h).id) }.include?(true))
          )
            holder << s
        end
      end
      holder
    }
    return supplier_set
  end

我正在使用此代码的最后一行筛选出:@new_record:

def self.visible_profiles_sorted(index_name)
      profiles = Supplier.set_for_index(index_name)

      answer = {}

      if !(profiles.nil? or profiles == [])
        profiles.each do |s|  
          #block odd error where cache appends a :@new_record after the last result
          next if !s.is_a?(Supplier) or s.address.nil? or s.address.country.nil?
...

错误,如果我没有屏蔽@new_record [这不是来自上面的代码,而是来自另一个地方,我尝试使用缓存,其中基于类的测试是不可行的] :

2013-08-28T20:50:00.446550+00:00 heroku[web.1]: State changed from starting to up
2013-08-28T20:50:06.774001+00:00 app[web.1]: Dalli/SASL authenticating as af5c2c
2013-08-28T20:50:06.777925+00:00 app[web.1]: Dalli/SASL: af5c2c
2013-08-28T20:50:06.807129+00:00 app[web.1]: Started GET "/suppliers" for 70.36.146.74 at 2013-08-28 20:50:06 +0000
2013-08-28T20:50:10.671553+00:00 app[web.1]: 
2013-08-28T20:50:10.671553+00:00 app[web.1]:     37:                                    <td>
2013-08-28T20:50:10.671553+00:00 app[web.1]: ActionView::Template::Error (undefined method `name' for :@new_record:Symbol):
2013-08-28T20:50:10.671553+00:00 app[web.1]:     39:                                            <%= link_to s.name, supplier_profile_path(s.name_for_link) %>
2013-08-28T20:50:10.671553+00:00 app[web.1]:     40:                                            <%= image_tag 

application.rb的相关位:

module Partreach
  class Application < Rails::Application

    config.cache_store = :dalli_store

production.rb的相关位:

Partreach::Application.configure do
  # Settings specified here will take precedence over those in config/application.rb

  # Code is not reloaded between requests
  config.cache_classes = true

  # Full error reports are disabled and caching is turned on
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

Gemfile的相关位:

gem 'dalli', '2.6.4' #https://devcenter.heroku.com/articles/building-a-rails-3-application-with-memcache
gem 'memcachier', '0.0.2' #https://devcenter.heroku.com/articles/building-a-rails-3-application-with-memcache

1 个答案:

答案 0 :(得分:3)

我之前遇到过同样的事情。它甚至列在dalli的问题页面上 - 但它不仅限于此。

您可以在此处找到更多信息: https://github.com/mperham/dalli/issues/250

在轨道问题页面上: https://github.com/rails/rails/issues/8020

这个解决方法为我解决了这个问题: https://github.com/rails/rails/issues/10322#issuecomment-16913855