Ruby on rails 3.2 Rails应用无法封送Dalli memcache的ActiveRecord对象数组
我正在尝试memcache一个ActiveRecord结果数组,我已经根据一些复杂的业务规则手动筛选了该数组。今天升级后,我遇到了一个严重错误,因为Dalli试图序列化阵列,但失败了,出现以下错误: 密钥的编组错误 “workcases/index/1570/true/c1…:md5:64db5952f959c4512639dd4cb113f86”: 无法转储UNIXSocket 在…/gems/dalli-2.6.4/lib/dalli/server.rb:397:in'dump' 这在从Ruby 1.9.3升级到Ruby 2.0.0以及将Passenger从4.0.5升级到4.0.7之前是没有发生过的 环境: Ruby 2.0.0-p247 轨道3.2.13 达利创业板2.6.4 乘客4.0.7 一段代码,消除了许多和此问题无关的复杂性Ruby on rails 3.2 Rails应用无法封送Dalli memcache的ActiveRecord对象数组,ruby-on-rails-3.2,marshalling,passenger,dalli,Ruby On Rails 3.2,Marshalling,Passenger,Dalli,我正在尝试memcache一个ActiveRecord结果数组,我已经根据一些复杂的业务规则手动筛选了该数组。今天升级后,我遇到了一个严重错误,因为Dalli试图序列化阵列,但失败了,出现以下错误: 密钥的编组错误 “workcases/index/1570/true/c1…:md5:64db5952f959c4512639dd4cb113f86”: 无法转储UNIXSocket 在…/gems/dalli-2.6.4/lib/dalli/server.rb:397:in'dump' 这在从Ru
# The query and filter
def do_query
workcases = Workcase.all(:select=>"#{straight_join} distinct
workcases.id, workcases.caseId, workcases.subject
service_case_types.primary_level, service_case_types.hide_in_result_list #{extra_fields}",
:conditions => conditions, :joins=>joins, :order=>order )
for workcase in workcases
if user.can_view_workcase?(workcase, options)
workcases_filtered << workcase
res_count+=1
end
break if limit && res_count >= limit
end
workcases_filtered
end
# In the Controller
def index
...
@workcases = Rails.cache.fetch(cid, :expires_in=>expires) do
Rails.logger.info "Populating cache for workcases in search"
ActiveRecord::Base.uncached do
Workcase.do_query(@user, in_summary_list, order, nil, true, !@show_deleted_items, condition_ary, @list_limit, {:service_id=>service_id, :case_type_id=>case_type_id})
end
end
...
end
将完整查询结果集推入缓存的原因是运行业务逻辑以过滤数据库结果以处理复杂的用户安全/访问控制需求所需的时间。因此,我知道这可能不是Rails中缓存的首选用法,但直到昨天,它仍然像做梦一样工作。我真的不想寻找像“只缓存主键”这样的答案,因为我根本不需要缓存
额外说明:
我尝试使用RVM回滚到Ruby 1.9.3,并重新启动了应用程序,错误没有消失。在我的开发环境中,使用Webrick和其他等效的ruby和gem版本,我没有看到这个错误
我想知道:
UNIXSocket从哪里来?
关于如何调试的任何线索,我已经查看了正在缓存的实例,其中没有任何进程
是否存在突然出现在元帅或Dalli中的关联或加入的问题
乘客是否影响Dalli和/或元帅的工作?
事实上,在这一点上,任何想法都是值得赞赏的
编辑
我曾尝试回滚到早期版本的乘客创业板,但这没有帮助。我还用Ruby 1.9.3的早期版本尝试了rvm,但也没有解决这个问题。我不相信Dalli gem在更新之间发生了变化
另外请注意,其他查询正在成功写入memcache。我在AR属性解组方面遇到了一些类似的问题。我目前的最佳猜测是,这是在尝试将mysql连接缓存到属性中,或者有一个嵌入的缓存结果被推送到要缓存的数据中。总的来说,memcache对于activerecord来说并不像我们想象的那样天衣无缝