缓存穿透
缓存穿透指的是请求的数据在缓存中不存在,并且也不存在于数据库中,每次请求都落到了数据库上,导致数据库压力增大。
举例: 现在你有一家书店,书分别存放在书架(缓存)和仓库(数据库)中。一本书在书架上和仓库里都不存在,但是总是有人来找这本书,导致你每次都需要去仓库中寻找。
图解:
解决方案:
1、缓存空结果
如果系统发现 Redis 及 DB 中都不存在该资源,就缓存空结果一段时间。需要注意哈,这次的失效时间不能设置的太长,否则数据的实效性会产生很大的问题。
2、用户合法性校验
对用户的请求合法性进行校验,拦截恶意重复请求。
3、布隆过滤器
如果布隆过滤器判断不存在一定不存在,但是布隆过滤器判断存在不一定真存在
缓存击穿
缓存击穿指的是一个请求需要的数据不在缓存中,但数据库中存在,在某一个时刻,缓存中的数据过期了,同时有大量请求(都是请求这个过期数据的请求)到达,大量请求落到了数据库上。
举例: 现在你有一家书店,书分别存放在书架(缓存)和仓库(数据库)中。一本书本来在书架上有,但是被买完了(缓存失效),这个时候有很多人来买这边书,大家都去仓库中找这本书
图解:
解决方案:
1、设置热点数据永不过期
对于频繁访问的热点数据,设置其在缓存中永不过期,通过后台更新缓存来保证数据的新鲜度。
2、使用互斥锁
对于同一资源的访问,使用互斥锁确保同时只有一个请求去数据库中查询并更新到缓存,其他请求等待缓存更新后再访问缓存。(这个操作会降低吞吐量,使用第一种方案就可以解决缓存击穿问题)
缓存雪崩
缓存雪崩指的是大量的缓存数据在同一时间失效,导致大量请求(不同请求)到达数据库中。
举例: 现在你有一家书店,书分别存放在书架(缓存)和仓库(数据库)中。由于书店太过火爆,你的很多书都卖完了,同时又来了很多顾客需要购买这些书,大家只能都是仓库中找书
图解:
解决方案:
1、分散设置过期时间
避免缓存设置相近的有效期,我们可以在设置有效期时增加随机值
2、多级缓存
使用多级缓存策略,例如:本地缓存、分布式缓存(redis)等
3、缓存预热
面临将要来的大量请求,可以先去数据库中去数据到缓存中,并设置不同的过期时间
总结
- 缓存击穿和缓存穿透都是访问的同一组数据,数据都在缓存中不存在,不同点在于缓存穿透的数据在数据库中也不存在,缓存击穿的数据在数据库中存在
- 缓存雪崩是不同组数据在缓存中失效
- 相同点:同一时间都有大量请求到达,请求数据在缓存中都不存在
参考文章:
牛逼,三句话搞懂 Redis 缓存穿透、击穿、雪崩! - 知乎
Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩 - 知乎
标签:缓存,请求,数据库,击穿,穿透,雪崩 From: https://blog.csdn.net/q_334173630/article/details/136858031