加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 将从传递给Rails.cache.fetch的块返回一个nil

发布时间:2020-12-17 02:14:20 所属栏目:百科 来源:网络整理
导读:我们假设我有一个这样的方法: def foo Rails.cache.fetch("cache_key",:expires_in = 60.minutes) do return_something end end return_something有时会返回一个nil值.发生这种情况时,我不希望将nil值缓存60分钟.相反,下次我调用foo时,我希望传递给fetch的
我们假设我有一个这样的方法:

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时.

解决方法

它取决于您正在使用的缓存存储的实现.我会说它不应该缓存nil值,但空字符串可以缓存.

看看dalli store implementation即:

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,options) { |payload| }
        entry
      else
        result = instrument(:generate,options) do |payload|
          yield
        end
        write(name,result,options)
        result
      end
    else
      read(name,options)
    end
  end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读