同じデータに対してデータベースに何度もアクセスする必要がないように、承認されたページの 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
approved
onPage
は単純where(:approved => true)
で、 data はオブジェクト サブセットの大きな配列です#<Page id: 1, permalink: "page-permalink-1">
(配列は約 50,000 オブジェクトです)。
コンソールから実行すると、このRails.cache.write
行が返され、development.log が次のように表示されます。false
Cache 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
ます...つまり、機能していますが、そのための設定のみですかメソッド呼び出しのスレッド/インスタンス?