2013-08-06 28 views
0

我有一個緩存的對象,需要相當一段時間來計算(~30秒)。我每24小時重新計算一次這個對象,如果發生這種情況,有時用戶會遇到暫停,如果它們恰好在同一時間在這裏。我緩存的對象目前的工作原理是這樣的:

def matrix  
    Rails.cache.fetch(["matrix"], expires_in: 24.hours) do 
     # Math 
    end 
    end 

我想要做的是附加一個版本。這樣我可以計算與不同方法的背景一個新的「矩陣」 ......

def rewrite_matrix 
    new_version = DateTime.now.to_s 

    Rails.cache.fetch(["matrix", new_version], expires_in: 24.hours) do 
     # Math 
    end 

    $matrix_version = new_version # This feels like a faux pas. 
    end 

,然後改變我的陣法像...

def matrix 
    $matrix_version ||= DateTime.now.to_s 

    Rails.cache.fetch(["matrix", $matrix_version], expires_in: 24.hours) do 
     # Math 
    end 
    end 

我一直閱讀Ruby/Rails中的全局變量,並且所有內容都表示不應該被觸及?這個$ matrix_version變量是否可用於其他進程和其他用戶?無論如何,我希望知道如何解決方法或在後臺創建新的緩存版本,然後在完成計算和存儲時纔開始使用它。

回答

1

想到的只是做一些計算第一個第一個想法:

def matrix  
    Rails.cache.fetch('matrix') do 
    calculate_matrix 
    end 
end 

def rewrite_matrix 
    new_version = calculate_matrix 

    Rails.cache.delete('matrix') 
    Rails.cache.fetch('matrix') do 
    new_version 
    end 

end 

def calculate_matrix 
    #Math 
end 

如果你打電話rewrite_matrix每24小時(在一個單獨的進程),它首先應該做的工作,然後更新緩存,它在用戶工作時仍然可用。

1

如果需要24小時,我建議不要過期緩存。相反,只需在準備好新版本時將其替換即可。

class YourModel 
    def matrix  
    Rails.cache.fetch(["matrix"]) do 
     math 
    end 
    end 

    def self.recalculate_matrix 
    Rails.cache.set(["matrix"]) do 
     math 
    end 
    end 
end 

然後,也許使用whenever gem

every 1.day, :at => '4:30 am' do 
    runner "MyModel.recalculate_matrix" 
end 
相關問題