缓存击穿、穿透、雪崩
2021-11-06 本文已影响0人
JackSpeed
-
穿透:缓存中没有这笔数据,请求直接打到DB上
解决思路: 存储null key ,使用布隆过滤器。场景:如果查询缓存结果为空则开始加可重入锁,接着再查一次缓存,缓存不存在再查询数据库,如果数据库结果为空则返回错误,如果数据库有值则写入缓存,释放锁;这个过程保证当前key即使有N个请求进来,单是只有一个线程能请求到数据库,其他的线程会被阻塞,等查DB的线程结束则更新缓存,此时外面的其他线程进来再查一次缓存即可查到数据。如果数据库也不存在,一般情况下也不存null key在数据库中,因为即使它下一回合再来N个请求,DB还是压力没有N个直接请求的大。 -
击穿:热点key过期或缓存中根本不存在(未命中)这个key突然被大量访问;数据库有,redis没有,导致所有流量打到数据库上
解决思路:同上 -
雪崩:
3.1. 场景1:key的数量是N,同时过期了导致缓存雪崩;
3.2. 大量没有被缓存的数据被同时请求,数据再DB中存在,redis不存在
解决思路:同上