Caching 如何处理高负载网站上memcached中的过期项目(由于TTL)?

Caching 如何处理高负载网站上memcached中的过期项目(由于TTL)?,caching,memcached,high-load,Caching,Memcached,High Load,当峰值为每秒600个请求时,由于TTL过期,memcache刷新项目会产生一些非常负面的影响。几乎在同一时间,200个线程/进程发现缓存为空,并发出一个DB请求再次填充缓存 处理这些情况的最佳做法是什么 p、 这种情况的术语是什么?(让我有机会在这个主题上获得更好的谷歌结果)如果你有大量请求所需的memcached对象(你的意思就是这样),那么我会考虑使用一个单独的进程或cron作业来定期计算和刷新这些对象。那样的话,它永远不会去TTL。这是一个常见的权衡:在流量较低的时间段添加一些不必要的负载

当峰值为每秒600个请求时,由于TTL过期,memcache刷新项目会产生一些非常负面的影响。几乎在同一时间,200个线程/进程发现缓存为空,并发出一个DB请求再次填充缓存

处理这些情况的最佳做法是什么


p、 这种情况的术语是什么?(让我有机会在这个主题上获得更好的谷歌结果)

如果你有大量请求所需的memcached对象(你的意思就是这样),那么我会考虑使用一个单独的进程或cron作业来定期计算和刷新这些对象。那样的话,它永远不会去TTL。这是一个常见的权衡:在流量较低的时间段添加一些不必要的负载,以帮助减少高峰时段(您可能最关心的时间)的负载

我发现这被memcached的人称为“踩踏群”,他们在这里讨论:


我的下一个建议实际上是使用上面链接中讨论的软缓存限制。

如果您的对象因设置了过期日期而过期,那么除了增加过期时间之外,您别无选择

如果您担心过时的数据,可以考虑以下几种技术:

  • 考虑让缓存成为您正在查看的任何数据的权威源,并创建一个线程,其任务是保持其新鲜。这将使其他线程在重新填充缓存时阻塞,因此只有在可以的情况下才有意义

  • 与其在数据上设置TTL,不如更改任何更新数据的进程以更新缓存。我用于频繁更改数据的一种技术是以概率的方式执行此操作——数据写入的时间有10%是更新的。您可以根据DB查询的开销和陈旧数据的影响程度,对其进行合理的调整


增加TTL?有更多的记忆吗?“有更多的记忆吗?”——音乐让我耳目一新如果只是…@carl:有时候你希望ttl去,这样时间就会更新到更多最新的值。情况并不总是像我描述的那样糟糕。一些较小的缓存项在到期时具有较少的db请求,但相同的效果(尽管规模较小)仍然存在。例如,如果memcached能够在启动前几秒钟让一个请求在其他请求获得相同的缓存未命中之前启动,这将是一个不错的选择。(虽然这可能会引起一些其他问题)对于您的评论,我打算建议软缓存限制,但在搜索该限制的名称时(我忘了),我发现memcached的人在谈论您的问题并概述了一些建议,因此我更新了答案。感谢您提供的信息丰富的答案。我从中学到了很多+1.