缓存穿透
【什么是缓存穿透】
频繁查询不在缓存中的数据,给原本被缓存保护的系统过大压力。
【为什么会发生缓存穿透】
1. 程序没写好;
2. 恶意攻击。
【怎样防止缓存穿透】
1. 在对 key 进行查询之前,先做初步判断,如果 key 一定不存在(例如,对某表的缓存,key 一定由数字组成,那么包含非数字的key一定是不存在的),则不查缓存或数据库,直接给结果;
2. 对于攻击 key 范围小的情形,未命中缓存,且未在数据库中查询到的情形,也放入缓存,用一个特殊的 value 表示此 key 不存在。
缓存雪崩
【什么是缓存雪崩】
一大批 key 几乎同时失效,给原本被缓存保护的系统过大压力。
【怎样预防缓存雪崩】
1. 缓存失效后,通过加锁或任务队列来限制读取后端系统的并发数;
2. 给过期时间增加随机值:过期时间由原来的 T 改为 T+R,其中 R 为一个合理范围内的随机数,使得缓存不会大批量同时失效;
3. 做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置短一些,A2 设置长一些。