簡體   English   中英

重新緩存活動記錄

[英]Resque caching active record cal

我有一個簡單的resque作業,它接受模型id,將其獲取,然后在獲取的項目上調用一個方法。

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

我使用'enqueue'方法從Cupcake的模型after_commit排隊

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

作業排隊並正確執行。 但是,如果我在數據庫中或通過UI修改記錄的數據,並再次將作業排隊,則操作不會使用新值執行。

如果重新啟動resque worker進程,則只能獲取新值。 重新排序是否緩存對象? 有沒有辦法確保每次調用worker時都會從數據庫中重新獲取?

編輯:

我什至拉出查詢日志...提交發生在獲取杯形蛋糕的選擇查詢之前。.因此,這既不是訂單的競爭條件,也不是查詢獲取時的緩存問題...笨笨。 。 會是什么呢? 順便說一句,我在rails 2.3.8中使用after_commit gem和redis n resque組合

您可以嘗試使用此代碼強制reque命中數據庫

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

2.3.8中提供了uncached

除非問題不是真正的緩存問題,否則它應該起作用。 讓我們知道它是否適合您。

我遇到了症狀完全相同的問題

深入研究后,我發現問題出在命名范圍內

我在表演中有這樣的事情:

letter = Letter.to_process.first

在模型中

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

這是錯誤的,因為它始終以與第一次執行命名范圍相同的schedule_at值運行

這是正確的

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

如果這與您的情況沒有任何關系-如果您只是普通的find(id)有問題,請嘗試添加

Cupcake.connection.clear_query_cache

在執行方法的最后

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM