救援缓存activerecord cal

时间:2013-02-26 15:20:51

标签: ruby-on-rails activerecord redis resque

我有一个简单的resque作业,它接受一个模型id,获取它,然后在获取的项目上调用一个方法。

class CupcakeWorker
  @queue = :cupcake_queue
  def self.perform(cupcake_id)
    @cupcake = Cupcake.find(cupcake_id)
    p @cupcake
  end
end

我从Cupcake的模型中排队,after_commit使用'enqueue'方法

def bake
  Resque.enqueue(CupcakeWorker, self.id)
end

作业排队并正确执行。但是,如果我在数据库中或通过UI修改记录的数据并继续将作业排队,则不会使用新值执行操作。

如果我重新启动resque工作进程,我只能获取它来获取新值。是resque缓存对象?有没有办法确保每次调用worker时都从数据库中重新获取?

编辑:

我甚至提取了查询日志......提交发生在获取Cupcake的select查询之前。 所以这既不是订单的竞争条件,也不是查询提取的缓存问题...... 我是无能为力的家伙......它会是什么? 顺便说一句,我在rails 2.3.8和redis n resque combo中使用了after_commit gem

2 个答案:

答案 0 :(得分:0)

您可以尝试使用此代码强制resque命中数据库

ActiveRecord::Base.uncached do
  @cupcake = Cupcake.find(cupcake_id)
end

{{}}

中提供了

未缓存的内容

这应该有效,除非问题不是真正的缓存问题。如果它适合您,请告诉我们。

答案 1 :(得分:0)

我遇到了完全相同症状的问题

深入挖掘后我发现,我的问题在于命名范围

我在演出中有这样的事情:

letter = Letter.to_process.first

在模特中我有

scope :to_process, where("scheduled_at < ?", Time.now).where('finished_at IS NULL').order('scheduled_at')

这是错误的,因为它始终以与第一次执行命名范围相同的scheduled_at值运行

这是正确的

scope :to_process, lambda { where("scheduled_at < ?", Time.now).where('finished_at IS NULL').order('scheduled_at') }

如果这与你的情况没有任何关系 - 如果你只是普通的查找(id)有问题,试着添加这个

Cupcake.connection.clear_query_cache

在执行方法结束时