2

同じデータに対してデータベースに何度もアクセスする必要がないように、承認されたページの ID とパーマリンクの大規模な配列を memcache に保存しようとしています。

私のコード:

if Rails.cache.exist?("ids_and_permalinks_array")
  data = Rails.cache.fetch("ids_and_permalinks_array")
else
  data = []

  Page.approved.select('id, permalink').find_each { |f| data << f }

  Rails.cache.write("ids_and_permalinks_array", data, :expires_in => 12.hours)
end

approvedonPageは単純where(:approved => true)で、 data はオブジェクト サブセットの大きな配列です#<Page id: 1, permalink: "page-permalink-1">(配列は約 50,000 オブジェクトです)。

コンソールから実行すると、このRails.cache.write行が返され、development.log が次のように表示されます。falseCache write: ids_and_permalinks_array ({:expires_in=>43200 seconds})

そのため、ログにはキャッシュに書き込んでいると表示されRails.cache.fetch("ids_and_permalinks_array")ますが、 nil.

提案?私が間違っていることは明らかですか?

編集

私もこれを試しましたが、まだ値がキャッシュに書き込まれません:

Rails.cache.fetch("ids_and_permalinks_array", :expires_in => 12.hours, :race_condition_ttl => 10.minutes) do
  Page.approved.select('id, permalink').find_each { |p| data << p }
end

** 更新 2 **

このコードが含まれているメソッド呼び出しの最初と最後に追加Rails.logger.info("\n#{Rails.cache.exist?("ids_and_permalinks_array")\n")しました。毎回、メソッド呼び出しの最初にログが記録falseされ、最後にログが記録されtrueます...つまり、機能していますが、そのための設定のみですかメソッド呼び出しのスレッド/インスタンス?

4

1 に答える 1