Redis—缓存穿透、击穿和雪崩
学习记录缓存的使用
这篇文章讲得挺好:缓存穿透,缓存击穿,缓存雪崩详解及解决办法_liaozuyao的博客-CSDN博客_缓存击穿 缓存穿透 缓存雪崩
缓存穿透
指请求的key在缓存中不存在,大量的请求就会落在数据库上,但是查了数据库也没有相应数据,无法放入缓存,造成数据库执行了很多查询操作。每次都查询数据库,就像缓存没有用了,被穿透。
如:数据库中有数据id 1-102.现在发起id=102和id=103的请求


可以看到id为103的查询一直从数据库查数据,需要数据库承担了压力。
解决方案:
- 缓存空对象
缓存和数据库查的数据未null时,也将id及null存储起来,这样同样的id再次访问时,缓存中也有对应的数据提供,只是数据是null。

- 布隆过滤器
使用bitmap存储所有已存在的key,通过该布隆过滤器拒绝不存在key的请求
缓存击穿
指在缓存中的某“热点”数据,因为设置了缓存的过期时间,在某一时刻,缓存过期后,所有的请求直接作用在了数据库上,造成了数据库无法承担的压力挂掉了。
如:数据库中有id 1-102的数据,请求id=102的数据,开始请求时,查询数据库后设置缓存,并且过期时间为10s。后续请求均从缓存中取出数据。


但是10s后的查询均作用在了数据库上

可以看到缓存过期后,数据库承担了所有压力。
解决方案:
- 担心缓存过期,那就给他自动续期
因为缓存在10s后过期,那么我们就可以在过期前,比如8s时在设置缓存过期时间为10s。
可以设置缓存不过期,自然就不会担心过期带来的击穿
加锁,在查询缓存发现没有后,加锁进行数据库查询,并且设置缓存
缓存雪崩
击穿是个别数据缓存过期了,导致数据库承担压力。雪崩则大范围数据的缓存同时过期,大量请求导致数据库承担不了。
解决方案:
- 担心大范围缓存同时过期,就在设置缓存时间的时候,设置不一样的时间
可以看看我的学习——基于Hexo的个人博客: 网站:https://liwangc.gitee.io/
—————————————————————————
作为初学者,很多知识都没有掌握,见谅,如有错误请指出,以期进步,感谢!。后续有新的学习,继续补充上来。
