前言虽然缓存被认为是软件系统的性能助推器,但如果处理不当也容易出现错误。在本文中,我将介绍3个有时会造成灾难性后果的常见缓存问题,希望您在架构中引入缓存时需要考虑。CacheBreakdownCacheFaults当缓存键过期并且多个请求同时访问数据库以查找相同的键时,就会发生缓存故障。让我们看看它是如何工作的:热缓存键过期。多个并发请求进来搜索同一个键。服务器向数据库发出多个并发请求以获取相同的密钥。缓存穿孔会显着增加数据库的负载,尤其是在许多热键同时过期的情况下。这里有2种解决方案来解决这个问题:在搜索到的键上获取一个分布式锁,当一个线程试图更新缓存时,其他线程需要等待。使用Refresh-ahead策略异步刷新热数据,使热键永不过期。缓存穿透Cachepenetration当查询到的key既不在缓存中,也不在数据库中时,**会发生缓存穿透,**甚至数据库已经穿透。让我们看看它是如何工作的,当密钥既不在缓存中也不在数据库中时,就会发生这种情况。当用户查询某个键时,应用程序会由于缓存未命中而查询数据库数据库。由于数据库不包含该键并返回空结果,因此该键也不会被缓存。所以每次查询最终都会导致cachemiss,并且打到数据库,直接查数据库。虽然乍一看这似乎微不足道,但攻击者可以通过使用此类密钥启动大量搜索来尝试破坏您的数据库。为了解决这个问题,我们可以:缓存空结果,过期时间短。使用布隆过滤器。在查询数据库之前,应用程序在布隆过滤器中查找键,如果键不存在则立即返回。缓存雪崩当对数据库的请求突然激增时,就会发生缓存雪崩。这发生在:许多缓存数据同时过期。缓存服务宕机,所有请求直接到数据库。数据库流量的突然激增会导致级联效应,最终可能会导致您的服务崩溃。以下是一些常见的解决方案:调整缓存键的过期时间,使它们不会同时过期。热数据使用Refresh-ahead策略异步刷新,因此它永远不会过期。使用缓存集群来避免单点故障。当主节点崩溃时,其中一个副本被提升为新的主节点。总结虽然这些缓存问题乍一看似乎微不足道,但它们有时会对我们的下游客户端和依赖项产生连锁反应。事先了解它们可以让我们设计出更强大的系统,也可以简化我们的故障排除过程。
