缓存陷阱之缓存穿透、缓存击穿和缓存雪崩

分类:
数据库
标签:
缓存
Redis
作者:
何鑫
创作时间:
2019/12/05 17:34:51

摘要:教你如何避开缓存陷阱!

在web开发中,缓存可谓至关重要,它是我们应对高并发的重要利器之一。它可以加速数据读取,毫秒级响应,使用户的浏览体验更加顺畅,可以防止大量请求直接到数据库,减轻数据库压力,防止数据库崩溃带来的灾难性后果。在实际开发中,我们运用的缓存应用主要有两种:Redis和MemCache,它们各有优点,可以单独使用,也可以结合使用,为我们的网站保驾护航。当然要达到理想的缓存效果,也必须尽力避免缓存穿透、缓存击穿和缓存雪崩等缓存陷阱,本文将就此展开讨论,解析缓存陷阱出现的原因,并探讨避免缓存陷阱的可行性方案。

缓存穿透

缓存穿透指的是反复查询不存在的缓存,使大量请求直接到了数据库。缓存穿透出现在应用层面的情况不多,而更多的是有人刻意攻击而引发的,大量请求由于无法命中缓存而直接走向数据库,严重影响数据库性能甚至可能引发数据库崩溃。

知道原因我们自然也有办法来避免。我们可以从两方面着手。一方面,应用层面拦截非法参数,例如Id为-100,在大多数情况下,我们可以明确知道-100不会为Id,对于这种明显错误的参数,直接返回失败即可,不用查询缓存,因为缓存一般是无法命中的,会直接查询数据库。另一方面,对于无法从应用层面拦截而又不存在于缓存及数据库的数据,我们把缓存设置为空,这样也不会直接到数据库,但是需要注意,缓存时间不宜过久,数据库可能在缓存过期前又有了数据,所以我们需要尽力减少两者数据不一致的时间。

缓存击穿

缓存击穿是指同一缓存失效导致大量请求直接到了数据库。一般会存在于访问频繁的热点缓存,缓存过期致使大量请求到数据查询同一数据,从而导致缓存击穿。

怎么解决呢?对于热点缓存,不妨根据业务适当增加缓存时间(甚至永久存储),也可以预设缓存,在缓存过期前异步更新缓存数据,它们的目的只有一个:延长缓存的时间(甚至永久)。采用互斥锁,在缓存失效时使同一时间只能有一个线程查询数据库,其他线程等待或者直接返回失败也是应对缓存击穿的一种不错的方案。

缓存雪崩

缓存雪崩是指同一时间大量缓存失效,导致大量请求直接到了数据库。

应对缓存雪崩,最简单有效的方式就是对于不同缓存尽量错开失效时间!


综合上文,我们可以发现我们的根本目的就是使缓存发挥作用,阻止大量请求直接到数据库,把握这个准则,我们自然应对自如,玩转缓存,使网站安全流畅稳定运行!


发表评论

温馨提示: 评论先审核后发布, 请勿发表不良言论

所有评论