大厂门槛之缓存穿透、缓存雪崩和缓存击穿

如今redis被广泛的运用于各互联网公司中,无论是大厂还是普通的小公司均可看到其身影,对于后端程序员来说并不陌生。在面试中也是也是属于高频问题,其中缓存穿透、缓存雪崩和缓存击穿更是常见,今天小杨就和大家一起来认识认识其真面目。

缓存穿透

  • 理解穿透:
    数据在reids缓存中查询不到,直接到数据库中进行查询,也就是说redis无法为数据库分担压力,在高并发访问下,会造成性能下降,甚至数据库无法正常服务。
  • 如何解决:
  1. 设置校验规则,对于一些不符合规则的key可以在查询之前直接处理掉。或者是利用布隆过滤器(BloomFilter)先过滤
  2. 利用互斥锁。缓存失效或者查询不到的时候,先去获得锁,得到锁了,再去请求数据库。避免大量请求同时落到数据库中
  3. 无论数据库是否查询得到,都将值写到redis缓存中,后面的查询就直接落到redis中
  4. 可以对短时间内大量相同的请求的ip做限制访问

缓存雪崩

  • 理解雪崩:
    是指大量的相同时间的缓存在同一时间内过期或者是redis无法提供服务,此时,大量的用户请求落到数据库中进行查询,造成服务器压力过大
  • 如何解决:
  1. 建立高效,可用的redis架构,可以使用 主从+哨兵,保证reids稳定提供服务
  2. 避免缓存的过期时间大量相同,如可用给过期的时间加上随机数,分散失效。如果是热点数据可用设置不过期

缓存击穿

  • 理解击穿:
    是指一个缓存key为热点数据,当该缓存失效的时候,所以的请求都到数据库进行查询,导致数据库压力,宕机
  • 如何解决:
  1. 为缓存设置互斥锁,当第一个请求得到锁后就将该查询到的数据缓存起来,后面的请求就可以到redis中进行查询
  2. 如果是可预见的热点数据,可以直接设置不过期。

总结

面对上面三种情况,使用redis,我们可以事先搭建好稳定,可用的架构服务,如主从+哨兵。在使用的过程中,对请求进行过滤(如布隆过滤器或者是自定义的规则),避免过多无效的请求。做好限流、降级容灾,避免到数据库进行查询,导致数据库无法正常工作。

欢迎下方交流讨论。如果本篇博客有任何错误,请批评指教,不胜感激 !

共同进步,学习分享

觉得写的还不错的就点个赞,加个关注呗!持续更新 !!! 点关注,不迷路,小杨带你上高速

已经为大家整理好了几百本各类技术电子书和学习资料、最新的面试题,注公众号【写代码的小杨】回复【资料】无套路领取

海报无水印.png
421627049535_.pic.jpg
431627049543_.pic.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容