5

次のようなメソッドがあるとします。

  def foo
    Rails.cache.fetch("cache_key", :expires_in => 60.minutes) do
      return_something
    end
  end

return_something時々nil値を返します。nilこれが発生した場合、値を 60 分間キャッシュしたくありません。代わりに、次に を呼び出すときにfoo、渡されたブロックをfetch再度実行するようにします。

Rails.cache.fetchデフォルトでこのように機能していますか?または、この機能を実装する必要がありますか?

更新(回答あり)

少なくとも Memcached を使用している場合、答えはノーでした。

4

3 に答える 3

2

使用しているキャッシュストアの実装によって異なります。値をキャッシュするべきではないと思いnilますが、空の文字列はキャッシュしても問題ありません。

ダリストアの実装を見てください。

  def fetch(name, options=nil)
    options ||= {}
    name = expanded_key name

    if block_given?
      unless options[:force]
        entry = instrument(:read, name, options) do |payload|
          payload[:super_operation] = :fetch if payload
          read_entry(name, options)
        end
      end

      if !entry.nil?
        instrument(:fetch_hit, name, options) { |payload| }
        entry
      else
        result = instrument(:generate, name, options) do |payload|
          yield
        end
        write(name, result, options)
        result
      end
    else
      read(name, options)
    end
  end 
于 2012-10-15T10:01:55.817 に答える