我正在尝试memcache一个ActiveRecord结果数组,我已根据一些复杂的业务规则手动过滤。在今天升级之后,基于Dalli尝试序列化数组并因以下错误而失败,我收到了一个令人讨厌的错误:
密钥的编组错误 '工况的/指数/ 1570 /真/ C1 ...:MD5:64db5952f959c45126399dd4cb113f86': 无法转储UNIXSocket
in ... / gems / dalli-2.6.4 / lib / dalli / server.rb:397:in`dump'
在从Ruby 1.9.3升级到Ruby 2.0.0以及相关的Passenger升级到4.0.7(之前的4.0.5)之前,没有发生这种情况。
环境:
代码片段,消除了与此问题无关的许多复杂性
# 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中缓存的首选使用,但直到昨天它才像梦一样工作。我真的不是在寻找像'只是缓存主键'这样的答案,因为我根本不会打扰缓存。
额外注意事项:
我试图回滚到Ruby 1.9.3(使用RVM,并重新绑定应用程序)并且错误没有消失。在我的开发环境中,使用Webrick和其他等效的ruby和gem版本我没有看到这个错误。
我想知道:
事实上,任何想法都会受到赞赏。
修改
我试图回到乘客宝石的早期版本,但没有帮助。我还尝试使用早期版本的Ruby 1.9.3的rvm,但也没有解决它。我不相信Dalli宝石在更新之间发生了变化。
另请注意,其他查询正在成功写入memcache。