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