如今redis被广泛的运用于各互联网公司中,无论是大厂还是普通的小公司均可看到其身影,对于后端程序员来说并不陌生。在面试中也是也是属于高频问题,其中缓存穿透、缓存雪崩和缓存击穿更是常见,今天小杨就和大家一起来认识认识其真面目。
缓存穿透
-
理解穿透:
数据在reids缓存中查询不到,直接到数据库中进行查询,也就是说redis无法为数据库分担压力,在高并发访问下,会造成性能下降,甚至数据库无法正常服务。 - 如何解决:
- 设置校验规则,对于一些不符合规则的key可以在查询之前直接处理掉。或者是利用布隆过滤器(BloomFilter)先过滤
- 利用互斥锁。缓存失效或者查询不到的时候,先去获得锁,得到锁了,再去请求数据库。避免大量请求同时落到数据库中
- 无论数据库是否查询得到,都将值写到redis缓存中,后面的查询就直接落到redis中
- 可以对短时间内大量相同的请求的ip做限制访问
缓存雪崩
-
理解雪崩:
是指大量的相同时间的缓存在同一时间内过期或者是redis无法提供服务,此时,大量的用户请求落到数据库中进行查询,造成服务器压力过大 - 如何解决:
- 建立高效,可用的redis架构,可以使用 主从+哨兵,保证reids稳定提供服务
- 避免缓存的过期时间大量相同,如可用给过期的时间加上随机数,分散失效。如果是热点数据可用设置不过期
缓存击穿
-
理解击穿:
是指一个缓存key为热点数据,当该缓存失效的时候,所以的请求都到数据库进行查询,导致数据库压力,宕机 - 如何解决:
- 为缓存设置互斥锁,当第一个请求得到锁后就将该查询到的数据缓存起来,后面的请求就可以到redis中进行查询
- 如果是可预见的热点数据,可以直接设置不过期。
总结
面对上面三种情况,使用redis,我们可以事先搭建好稳定,可用的架构服务,如主从+哨兵。在使用的过程中,对请求进行过滤(如布隆过滤器或者是自定义的规则),避免过多无效的请求。做好限流、降级容灾,避免到数据库进行查询,导致数据库无法正常工作。
欢迎下方交流讨论。如果本篇博客有任何错误,请批评指教,不胜感激 !
共同进步,学习分享
觉得写的还不错的就点个赞,加个关注呗!持续更新 !!! 点关注,不迷路,小杨带你上高速
已经为大家整理好了几百本各类技术电子书和学习资料、最新的面试题,注公众号【写代码的小杨】回复【资料】无套路领取
海报无水印.png
421627049535_.pic.jpg
431627049543_.pic.jpg