首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails 4俄罗斯玩偶缓存是如何防止踩踏的?

Rails 4俄罗斯玩偶缓存是如何防止踩踏的?
EN

Stack Overflow用户
提问于 2013-11-27 00:30:08
回答 3查看 2K关注 0票数 20

我正在寻找有关Rails4中的缓存机制如何防止多个用户试图一次重新生成缓存键的信息,也就是缓存蜂拥而至:http://en.wikipedia.org/wiki/Cache_stampede

我还没能通过谷歌找到太多信息。如果我看一下其他系统(比如Drupal),缓存抢跑预防是通过数据库中的semaphores表实现的。

EN

回答 3

Stack Overflow用户

发布于 2013-12-01 07:16:40

问得好。适用于单个多线程Rails服务器,但不适用于多进程(或)环境的部分答案是,ActionView模板编译代码在每个模板的互斥锁上阻塞。参见line 230 in template.rb here。请注意,在获取锁之前和之后都会检查已完成的编译。

其效果是序列化编译相同模板的尝试,其中只有第一个将实际执行编译,其余的将获得已经完成的结果。

票数 0
EN

Stack Overflow用户

发布于 2013-12-04 04:56:06

非常有趣的问题。我在谷歌上搜索(如果你搜索“狗堆”而不是“蜂拥而至”,你会得到更多的结果),但像你一样,我没有得到任何答案,除了这篇博客文章:protecting from dogpile using memcache

基本上,它将片段存储在两个键中:key:timestamp (对于活动记录对象,时间戳将为updated_at )和key:last

def custom_write_dogpile(key, timestamp, fragment, options)
  Rails.cache.write(key + ':' + timestamp.to_s, fragment)
  Rails.cache.write(key + ':last', fragment)
  Rails.cache.delete(key + ':refresh-thread')
  fragment
end

现在,当从缓存中读取并尝试获取不存在的缓存时,它是否会改为尝试获取key:last片段:

def custom_read_dogpile(key, timestamp, options)
  result = Rails.cache.read(timestamp_key(name, timestamp))

  if result.blank?
    Rails.cache.write(name + ':refresh-thread', 0, raw: true, unless_exist: true, expires_in: 5.seconds)
    if Rails.cache.increment(name + ':refresh-thread') == 1
      # The cache didn't exists
      result = nil
    else
      # Fetch the last cache, as the new one has not been created yet
      result = Rails.cache.read(name + ':last')
    end
  end
  result
end

这是我之前链接到的摩西·伯格曼的简化摘要,你也可以找到here

票数 0
EN

Stack Overflow用户

发布于 2013-12-04 11:40:45

没有针对memcache蜂拥而至的保护措施。当涉及多台机器并且这些机器上有多个进程时,这是一个真正的问题。-哦-.

当其中一个关键进程“死亡”,留下任何“锁定”时,问题就会变得更加复杂……锁住了。

为了防止抢购,你必须在数据过期之前重新计算数据。因此,如果您的数据在10分钟内有效,则需要在第5分钟重新生成,并将数据重新设置为新的过期时间10分钟。因此,您不必等到数据过期后才重新设置它。

也不应该允许您的数据在10分钟时过期,而是每5分钟重新计算一次,并且它永远不会过期。:)

您可以使用wget & cron定期调用代码。

我推荐使用redis,它允许您保存数据,并在发生崩溃时重新加载。

-daniel

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20222619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档