Redis—缓存穿透、击穿和雪崩

文章目录

    • 缓存穿透
    • 缓存击穿
    • 缓存雪崩

学习记录缓存的使用

这篇文章讲得挺好:缓存穿透,缓存击穿,缓存雪崩详解及解决办法_liaozuyao的博客-CSDN博客_缓存击穿 缓存穿透 缓存雪崩

缓存穿透

指请求的key在缓存中不存在,大量的请求就会落在数据库上,但是查了数据库也没有相应数据,无法放入缓存,造成数据库执行了很多查询操作。每次都查询数据库,就像缓存没有用了,被穿透。

如:数据库中有数据id 1-102.现在发起id=102和id=103的请求

Redis—缓存穿透、击穿和雪崩_第1张图片

Redis—缓存穿透、击穿和雪崩_第2张图片

可以看到id为103的查询一直从数据库查数据,需要数据库承担了压力。

解决方案:

  • 缓存空对象

缓存和数据库查的数据未null时,也将id及null存储起来,这样同样的id再次访问时,缓存中也有对应的数据提供,只是数据是null。

Redis—缓存穿透、击穿和雪崩_第3张图片

  • 布隆过滤器

使用bitmap存储所有已存在的key,通过该布隆过滤器拒绝不存在key的请求

缓存击穿

指在缓存中的某“热点”数据,因为设置了缓存的过期时间,在某一时刻,缓存过期后,所有的请求直接作用在了数据库上,造成了数据库无法承担的压力挂掉了。

如:数据库中有id 1-102的数据,请求id=102的数据,开始请求时,查询数据库后设置缓存,并且过期时间为10s。后续请求均从缓存中取出数据。

Redis—缓存穿透、击穿和雪崩_第4张图片

Redis—缓存穿透、击穿和雪崩_第5张图片

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

Redis—缓存穿透、击穿和雪崩_第6张图片

可以看到缓存过期后,数据库承担了所有压力。

解决方案:

  • 担心缓存过期,那就给他自动续期

因为缓存在10s后过期,那么我们就可以在过期前,比如8s时在设置缓存过期时间为10s。

  • 可以设置缓存不过期,自然就不会担心过期带来的击穿

  • 加锁,在查询缓存发现没有后,加锁进行数据库查询,并且设置缓存

缓存雪崩

击穿是个别数据缓存过期了,导致数据库承担压力。雪崩则大范围数据的缓存同时过期,大量请求导致数据库承担不了。

解决方案:

  • 担心大范围缓存同时过期,就在设置缓存时间的时候,设置不一样的时间

可以看看我的学习——基于Hexo的个人博客:
网站:https://liwangc.gitee.io/
—————————————————————————
//liwangc.gitee.io/](https://liwangc.gitee.io/)
—————————————————————————
作为初学者,很多知识都没有掌握,见谅,如有错误请指出,以期进步,感谢!。后续有新的学习,继续补充上来。

你可能感兴趣的:(【Redis】,【Spring,boot】,缓存,redis,数据库)