其实很多博主已经写了很多,关于这个缓存穿透、缓存雪崩、缓存击穿,我只想记录一下自己的笔记,以后就不要去看别人的笔记了
一、缓存穿透
(一)、概念
指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力
(二)、产生原因
1.业务不合理的设计,比如大多数用户都没开守护,但是你的每个请求都去缓存,查询某个userid查询有没有守护
2.业务/运维/开发失误的操作,比如缓存和数据库的数据都被误删除了
3.黑客非法请求攻击,比如黑客故意捏造大量非法请求,以读取不存在的业务数据
(三)、解决方式
1.如果是非法请求,我们在API入口,对参数进行校验,过滤非法值
2.如果查询数据库为空,我们可以给缓存设置个空值,或者默认值。但是如有有写请求进来的话,需要更新缓存哈,以保证缓存一致性,同时,最后给缓存设置适当的过期时间
3.使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时,先通过布隆过滤器判断值是否存在,存在才继续往下查。
二、缓存雪崩
(一)、概念
指缓存中数据大批量到过期时间,而查询数据量巨大,数据库请求量过大,数据库可能直接down掉,导致其他依赖这个数据库的接口请求不到数据,导致系统崩溃。
(二)、产生原因
缓存中数据大批量到过期时间,而查询数据量巨大,数据库请求量过大,数据库可能直接down掉。
(三)、解决方式
1.Redis 故障宕机也可能引起缓存雪崩。这就需要构造Redis高可用集群了
2.可通过均匀设置过期时间解决,即让过期时间相对离散一点。如采用一个较大固定值+一个较小的随机值,5小时+0到1800秒酱紫
三、缓存击穿
(一)、概念
指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db,跟缓存雪崩很像,但又不一样,击穿是一个点,雪崩一整个面甚至整个系统。
(二)、产生原因
热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db
(三)、解决方式
1.使用互斥锁方案。缓存失效时,不是立即去加载db数据,而是先使用某些带成功返回的原子操作命令,如(Redis的setnx)去操作,成功的时候,再去加载db数据库数据和设置缓存。否则就去重试获取缓存。
2. “永不过期”,是指没有设置过期时间,但是热点数据快要过期时,异步线程去更新和设置过期时间
这个是自己的笔记,利于自己的理解