阅读文本大概需要3分钟。    

       2019磕磕碰碰总算过去了,2020年秉承开源共享原则,继续分享在工作中遇到的各种问题和干货。2020年在面试题开始,祝愿小伙伴在2020年都能谋到一份好差事。

0x01:缓存穿透

       在高并发情况下,查询一个数据库和缓存都不存在的值时;如果缓存服务不对这个不存在的值进行缓存,导致缓存不会被命中,而大量请求直接落到数据库上。这种情况就叫缓存击穿。这种情况就是缓存和数据库都没有响应的值。

解决方案:

  • 缓存的key要按一定规则生成,然后集中拦截所有请求缓存的Key,如果请求的Key不满足既定的生成规则,就拒绝访问。

  • 对于NULL值,也直接缓存,但是缓存NULL的时间不能太长,否则NULL数据长时间得不到更新,也不能太短,否则达不到防止缓存击穿的效果

0x02:缓存击穿

       在高并发情况下,对一个特定的值进行查询,但是这个时候缓存正好过期了,缓存没有命中,而导致大量请求直接访问数据库,如活动系统里面查询活动信息。这种情况就是缓存没有对应的值,数据库有对应的值。

解决方案:

  • 设置热点Key对应的数据永远不过期

  • 读取数据库数据进行缓存时,增加互斥锁

0x03:缓存雪崩

       在高并发情况下,大量的缓存key在同一时间一起失效,导致大量的请求在缓存中获取不到数据,而直接访问数据库。

解决方案:

  • 尽量设置Key失效时间点均匀分布,即不同的Key设置不同的过期时间

  • 如果缓存数据库采用的是分布式部署,将热点数据均匀分布在不同的缓存数据库中

  • 设置热点数据永远不过期

       一句话缓存穿透、缓存击穿和缓存雪崩都是缓存失效导致大量请求直接访问数据库而出现的情况。不同的是缓存穿透是数据库和缓存都不存在相关数据;而缓存击穿和缓存雪崩是缓存和数据库都存在相应数据,只是缓存失效了而已。

往期精彩

01 漫谈发版哪些事,好课程推荐

02 Linux的常用最危险的命令

03 精讲Spring Boot—入门+进阶+实例

04 优秀的Java程序员必须了解的GC哪些

05 互联网支付系统整体架构详解

关注我

每天进步一点点

喜欢!在看☟

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐