别着急,坐和放宽
平时我们做项目时候使用缓存的方案,一般都是在数据库中存储一份,在缓存中存储一份。当用户的请求过来时。优先从缓存中获取数据,如果缓存中有数据,直接返回缓存中的数据,如果缓存中没有数据,那么就需要从数据库中取到数据并同步更新到缓存中,返回数据。如果这个时候查不到数据,一般就是返回空数据。
可是,当项目的数据和请求量到一个量级的时候,我们会发现这并不是一个有效可行的缓存机制。(ps:常用缓存机制如下图所示)
缓存雪崩,就像字面意思一样,因为缓存中的大部分数据在同一小段时间内都过期了。这个时候用户发送请求过来,而缓存中没有数据,这个时候大部分都会去请求数据库。而数据库是一个项目的瓶颈所在。数据库查询压力突然剧增。扛不住就宕机了。
其实从另一个方面来讲缓存击穿跟缓存雪崩挺像的。都是缓存的key失效导致的结果,只不过雪崩是大量的缓存失效,查询涌入DB导致宕机。而击穿是指什么呢,是指某一个缓存的数据集非常热点。本来就算再大的请求过来缓存都全盘接收并返回了。但是突然这个缓存失效了。所有的大量请求在一瞬间全部涌入Db。导致的宕机产生。举个栗子来讲就是,一个盾牌一直挡着所有的锋矛。突然这个盾牌消失了。然后全部扎在了身上。
至于什么是缓存穿透呢,缓存穿透是指缓存中没有数据库中也没有的数据。但是用户却在不停的发送请求。我们大部分数据库的数据使用的都是自增id。那么肯定是从1开始的。但是用户一直查询-1或者特别大并且数据不存在的id的时候就会一直查询数据库,而数据库也没数据,导致数据库压力非常大。严重的情况下会击垮数据库。这种通常也可能是攻击者。(小一点的单机应用,基本上用postman都能打崩)
布隆过滤器逻辑流程图