Ruby/Rails自定义搜索缓存如何设置10分钟过期时间
现有缓存写法的局限
你当前用的@returned_ids ||= begin ... end是实例变量级别的缓存,存在两个核心问题:
- 缓存生命周期和当前对象实例绑定,对Web请求场景来说,单次请求处理完成后控制器/服务对象实例会被销毁,缓存就直接失效,根本做不到跨请求复用
- 这种写法本身没有过期时间控制能力,只要实例没销毁,块里的逻辑只会执行一次,后续调用直接返回实例变量里存的值
10分钟过期缓存的推荐实现
直接用Rails内置的缓存接口Rails.cache.fetch,这是框架层面提供的标准缓存能力,原生支持过期时间配置,适配所有Rails支持的缓存后端(内存、Redis、Memcached等),修改后的代码如下:
def provide_book_ids(search_param) # 把搜索参数拼入缓存键,保证不同搜索条件的缓存互相隔离 cache_key = "book_search:ids:#{search_param}" Rails.cache.fetch(cache_key, expires_in: 10.minutes) do search = client.search(query: search_param, reload: true) search.fetch search.options[:query] = search_str search.fetch(true) search.map(&:id) end end
实现注意事项
- 缓存键必须包含动态的
search_param,否则不同搜索词会命中同一份缓存,返回错误结果 expires_in: 10.minutes直接指定缓存有效期为10分钟,到期后下次调用会自动执行块内的搜索逻辑,写入新的缓存值- 如果你确实只需要在单次请求生命周期内做10分钟过期(这种场景极少),可以额外存一个写入时间戳做判断,但常规搜索结果缓存都是跨请求生效的,上面的实现就是Rails生态里的通用标准方案
内容的提问来源于stack exchange,提问作者seanberlin
相关产品推荐
相关产品推荐

