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 変数は、他のプロセスや他のユーザーが利用できますか? とにかく、バックグラウンドで新しいキャッシュバージョンを回避または作成し、計算と保存が完了したときにのみ使用を開始する方法についてのアイデアを望んでいました。

4

2 に答える 2

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

24 時間ごとに (別のプロセスで)呼び出す場合rewrite_matrixは、最初に作業を実行してからキャッシュを更新する必要があります。キャッシュは、作業中にユーザーが引き続き使用できます。

于 2013-08-06T20:06:00.257 に答える
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

次に、多分いつでもgemを使用します:

every 1.day, :at => '4:30 am' do
  runner "MyModel.recalculate_matrix"
end
于 2013-08-06T20:06:35.197 に答える