1.缓存穿透
一般缓存是key-value结构,查询是使用key查询value,缓存中查不到,则需要去db中取值;若查询的value一定不存在,但对该key的请求并发很大,则会对db造成压力,称为缓存穿透;
- 避免
- value不存在也进行缓存,可设置较短的缓存时间;
- 对要查询的key进行过滤,如布隆过滤器;
2.缓存击穿
某一个key失效,同时有大并发查询此key,若所有请求都去db取数据,则会造成巨大压力;
- 避免
- 使用互斥锁,保证去db取数据时只有一个线程;(第一个线程查询到value为空,加锁后取db数据,load到缓存中;其他线程拿不到锁,不会去db load数据,进行等待)
- 缓存雪崩
同一时刻大量缓存失效,造成数据库压力; - 解决
- 在原有失效时间上加随机值,将缓存失效时间分散开;