当您有600个请求/秒的峰值时,由于TTL过期而刷新项目的内存缓存有一些非常不利的影响。几乎在同一时间,200个线程/进程发现缓存为空并触发数据库请求以再次填充
处理这些情况的最佳做法是什么?
P.S。这种情况的术语是什么? (让我有机会在主题上获得更好的谷歌搜索结果)
答案 0 :(得分:6)
如果你有大量请求需要的memcached对象(你暗示是这种情况),那么我会考虑使用一个单独的进程或cron作业来定期计算和刷新这些对象。那样它永远不应该是TTL。这是一个常见的权衡:在低流量时间内添加一些不必要的负载,以帮助减少峰值期间的负载(您可能最关心的时间)。
我发现这被memcached伙伴称为“踩踏牛群”,他们在此讨论:http://code.google.com/p/memcached/wiki/NewProgrammingTricks#Avoiding_stampeding_herd
我的下一个建议实际上是使用上面链接中讨论的软缓存限制。
答案 1 :(得分:0)
如果你的对象因为你设定了一个到期日而过期而且它已经过去了,那么除了增加到期时间之外你无能为力。
如果您担心陈旧数据,可以考虑使用一些技巧:
考虑使缓存成为您正在查看的任何数据的权威来源,并创建一个其工作是保持新鲜的线程。这将使其他线程在重新填充缓存时阻塞,因此只有在您可以
不是在数据上设置TTL,而是更改任何进程更新数据以更新缓存。我用于频繁更改数据的一种技术是概率性地执行此操作 - 10%的时间数据被写入,它会被更新。根据数据库查询的成本以及陈旧数据的影响程度,您可以根据合理的情况对此进行调整。