如何使用Rails.cache.fetch和memcache存储零?

凯尔西·汉南

我有一个现有的Model singleton方法,该方法触发要对缓存进行建模的昂贵的数据库查询。为此,我将Rails.cache.fetch()调用封装在有问题的方法周围:

# app/models/specialist.rb
class Specialist < ActiveRecord::Base

  def city
    Rails.cache.fetch([self.class.name, self.id, "city"], expires_in: 23.hours) do

      # expensive legacy query:
      if responded?
        o = offices.first
        return nil if o.blank?
        return o.city
      elsif hospital_or_clinic_only?
        (hospitals.map{ |h| h.city } + clinics.map{ |c| c.cities }).flatten.reject{ |i| i == nil }.uniq.first
      elsif hospital_or_clinic_referrals_only?
        (offices.map{ |o| o.city } + hospitals.map{ |h| h.city } + clinics.map{ |c| c.cities }).flatten.reject{ |c| c.blank? }.uniq.first
      else
        nil
      end

    end
  end

end

.city对所有记录执行通常需要16秒;使用此Rails.cache.fetch块,它仅下降到7秒,因为一半的记录仍在触发数据库调用。

当我调查时发现,该city方法返回时nil,Rails.cache不会将结果写入memcache中-这意味着尽管“缓存”了我的一半专家记录仍会触发昂贵的数据库查找

我如何在使用Memcache时强制Rails.cache.fetch存储的值,nil以便不会触发另一个再次查找nil的数据库查找?

马库斯

一种解决方案是使用NullObject,如下所示:

class Specialist
  NullData = Struct.new(nil)

  def city
    result = Rails.cache.fetch([self.class.name, self.id, "city"], expires_in: 23.hours) do
      if responded?
        ..
      else
        NullData.new()
      end
     result.is_a?(NullData) ? nil : result 
   end
end

这样,您将创建一个可以缓存的空对象。然后,当您返回时,请检查是否已存储了一个空对象,在这种情况下,您将返回nil(以确保您不会破坏依赖于您的方法返回nil的旧代码),否则您将返回缓存的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何强制Cache-Control在Rails 3.2.20中不存储

来自分类Dev

如何强制Cache-Control在Rails 3.2.20中不存储

来自分类Dev

处理Rails.cache.fetch中的错误

来自分类Dev

处理Rails.cache.fetch中的错误

来自分类Dev

DMA和Cache同时使用

来自分类Dev

使用“ Distributed Cache”和“ Options”选项来处理“ Cache Miss”

来自分类Dev

Rails cache_digests和条件

来自分类Dev

如何正确使用cache()?

来自分类Dev

如何结合@singledispatch和@lru_cache?

来自分类Dev

Rails.cache.fetch 不适用于 json 数组

来自分类Dev

什么使用和填充〜/ .cache / kioexec / krun /?

来自分类Dev

什么使用和填充 ~/.cache/kioexec/krun/?

来自分类Dev

Rails.cache.clear和rake tmp:cache:clear有什么区别?

来自分类Dev

Rails:如何增加counter_cache?

来自分类Dev

Rails 4,印象派和counter_cache

来自分类Dev

如何缩放max.incremental.fetch.session.cache.slots

来自分类Dev

使用参数运行rails dev:cache

来自分类Dev

如何使用Flask-Cache和Redis缓存SQL Alchemy调用?

来自分类Dev

如何使用Service Workers和Cache Api从基本URL脱机加载网站?

来自分类Dev

使用 RxJava 从 Cache 和其他 Flowable for DataSource Flowable

来自分类Dev

如何清理/ var / cache?

来自分类Dev

如何清理/ var / cache?

来自分类Dev

数组作为Rails.cache.fetch方法中的第一个参数

来自分类Dev

仅当新值不为nil时,带有expires_in的Rails.cache.fetch才会过期

来自分类Dev

尽管ActionController :: Base.perform_caching = false,Rails.cache.fetch仍在馈送/获取缓存

来自分类Dev

为什么这个代码块在 Rails.cache.fetch 之后执行

来自分类Dev

使用Memcache的PDO存储阵列

来自分类Dev

如何使用AngularJS启动$ http $ cache

来自分类Dev

如何为单个请求或代码块绕过Rails.cache?

Related 相关文章

  1. 1

    如何强制Cache-Control在Rails 3.2.20中不存储

  2. 2

    如何强制Cache-Control在Rails 3.2.20中不存储

  3. 3

    处理Rails.cache.fetch中的错误

  4. 4

    处理Rails.cache.fetch中的错误

  5. 5

    DMA和Cache同时使用

  6. 6

    使用“ Distributed Cache”和“ Options”选项来处理“ Cache Miss”

  7. 7

    Rails cache_digests和条件

  8. 8

    如何正确使用cache()?

  9. 9

    如何结合@singledispatch和@lru_cache?

  10. 10

    Rails.cache.fetch 不适用于 json 数组

  11. 11

    什么使用和填充〜/ .cache / kioexec / krun /?

  12. 12

    什么使用和填充 ~/.cache/kioexec/krun/?

  13. 13

    Rails.cache.clear和rake tmp:cache:clear有什么区别?

  14. 14

    Rails:如何增加counter_cache?

  15. 15

    Rails 4,印象派和counter_cache

  16. 16

    如何缩放max.incremental.fetch.session.cache.slots

  17. 17

    使用参数运行rails dev:cache

  18. 18

    如何使用Flask-Cache和Redis缓存SQL Alchemy调用?

  19. 19

    如何使用Service Workers和Cache Api从基本URL脱机加载网站?

  20. 20

    使用 RxJava 从 Cache 和其他 Flowable for DataSource Flowable

  21. 21

    如何清理/ var / cache?

  22. 22

    如何清理/ var / cache?

  23. 23

    数组作为Rails.cache.fetch方法中的第一个参数

  24. 24

    仅当新值不为nil时,带有expires_in的Rails.cache.fetch才会过期

  25. 25

    尽管ActionController :: Base.perform_caching = false,Rails.cache.fetch仍在馈送/获取缓存

  26. 26

    为什么这个代码块在 Rails.cache.fetch 之后执行

  27. 27

    使用Memcache的PDO存储阵列

  28. 28

    如何使用AngularJS启动$ http $ cache

  29. 29

    如何为单个请求或代码块绕过Rails.cache?

热门标签

归档