我通俗易懂的讲给你听,保证你一次记住
缓存穿透
穿透,如下图
编辑
客户端访问缓存, 缓存没数据,要去数据库查询, 数据库也没有, 频繁大量的这种查询请求,就穿透了,导致库崩了。
解决方案
1.访问一次,如果缓存层和数据库都没有,就在缓存层存一个对象, 下次访问就不用访问库了。
缺点:可能会存储很多的对象,浪费空间。
2.加布隆过滤器,就是一种数据结构, 一个长度m的 bit位数组 + n 个hash函数组成的数据结构。
说白了就是把数据库的数据在 这个数组做个标记, 先去缓存查数组,数组没这个标记说明没这条数据,就不去访问数据库了。
缺点:可能会出现标记显示的有,但是实际上没有的情况,但是这是偶然概率。如果标记显示没有就一定没有。
缓存击穿
击穿,并没有穿透, 如下图
编辑
没有透过数据库,说明数据库有数据。
缓存在内存,可能会过期,如果在某一时间查询的时候,缓存中的数据过期了,是不是就需要到数据库查,这个时候大量的请求会把数据库访问崩。
解决方案
1.设置永不过期的key,或者设置过期时间,同时启动定时任务去定时去更新这个缓存。
2.加锁,同一时间只有一个线程可以获取到锁,获得锁的线程去数据库把数据加载到内存。
缓存雪崩
雪崩就是全完蛋了,直接上图
编辑
如果redis崩了,或者在同一时间大量的Key过期了,是不是就不走缓存了,直接访问数据库了,直接访问数据请求太多的话,数据就有可能崩。
解决方案
1.高可用呗,做集群,一个崩了,有其他的顶上。
2.限流组件开启,高并发给一部分请求降降级,限限流。
3.避免同一时间大量的Key过期,那就 随机设置过期时间,过期时间长点,或者设置永不过期。
4.redis可内存可持久化没忘了吧, 把持久化开启,发生雪崩就从RDB和AOF文件中恢复。
ps:来自大山放牛的孩子,追求更高更牛的技术。
如果文章对你有帮助,点个关注吧!