0

5 つのタグがあるとしますtag1,tag2...tag5。私が次のことをした場合:

Rails.cache.fetch("all.tags") { Tag.all }

その後、 と書くRails.cache.fetch("all.tags")と、5 つのタグが表示されます。別のタグを追加して、キャッシュから再度取得しようとすると、新しいタグも読み込まれます。何故ですか?

編集:これが私の実際のコードです:

Rails.cache.fetch("autocomplete.#{term}") { puts "Cache miss #{term}"; Tag.starting_with(term) }

どこstarting_withで特定の文字で始まるタグを見つける場所を実行しています。コンソールでの動作は次のとおりです。

1.9.3p125 :046 > Rails.cache.read("autocomplete.ta")
  Tag Load (1.0ms)  SELECT "tags".* FROM "tags" WHERE (name like 'ta%')
 => [#<Tag id: 10, name: "tag1">, #<Tag id: 11, name: "tag2">, #<Tag id: 12, name: "tag3">, #<Tag id: 13, name: "tag4">]
1.9.3p125 :048 > Tag.create(name:"tag5")
   (0.2ms)  begin transaction
  SQL (1.0ms)  INSERT INTO "tags" ("name") VALUES (?)  [["name", "tag5"]]
   (150.9ms)  commit transaction
 => #<Tag id: 14, name: "tag5"> 
1.9.3p125 :049 > Rails.cache.read("autocomplete.ta")
  Tag Load (0.8ms)  SELECT "tags".* FROM "tags" WHERE (name like 'ta%')
 => [#<Tag id: 10, name: "tag1">, #<Tag id: 11, name: "tag2">, #<Tag id: 12, name: "tag3">, #<Tag id: 13, name: "tag4">, #<Tag id: 14, name: "tag5">] 
4

2 に答える 2

1

不可能です 。

キャッシュはキーと値のペアで機能しました。

Rails.cache.fetch("all.tags") { Tag.all }

保存されたキー "all.tags" の値を常に返します。

キャッシュに保存されているかどうかに関係なく、値を読み取ってみてください。そして、新しいタグを追加します

Rails.cache.read("all.tags")

あなたの質問の答えではないことはわかっていますが、なぜそれが起こったのか知りたいです.

キャッシュ設定で他に何かしていますか?

于 2012-04-11T07:06:10.177 に答える
1

あなたはコードを示していませんがTag.starting_with_term、それがスコープであるか、スコープのようなもの、つまり次のようなものを返すことにかなりのお金を賭けます

Tag.where(...)

Tag.allこれは、最初の質問とは根本的に異なりますTag.all。配列ですが、上記はスコープです。スコープは遅延評価され、スコープが実際の配列である必要があるスコープでメソッドを呼び出した場合にのみ、データベースから行が要求されます。

ここで起こっていることは、スコープが選択する行ではなく、実際のスコープをキャッシュしていることです。別の見方をすると、現時点では、クエリの結果ではなく、クエリを構成する条件をキャッシュしていると言えます。

キャッシュから読み取ると、スコープがキャッシュから取得され、それを表示しようとするとレールが強制的に評価されます。この評価はスコープがキャッシュから取得された後に行われるため、常に最新の結果が得られます。

最も簡単なことは、スコープの評価を強制することです。つまり、次のようなものです。

Rails.cache.fetch('cache_key') { Tag.starting_with(term).all }
于 2012-04-11T08:13:23.077 に答える