缓存击穿
在高并发访问下,某个热点key突然失效,大量请求直接查询数据库,对数据库造成很大压力。
解决方案:
- 设置热点数据永不过期:热点数据会经常访问,可以设置过期时间很长或者永不过期。
- 互斥锁:加锁控制对数据库的访问,确保只有一个请求去查询数据库数据并更新到缓存。
缓存穿透
请求的数据在缓存和数据库中都不存在,每次都是绕过缓存直接查数据库,导致数据库压力增加。 解决方案:
- 缓存空对象:当缓存没有,直接查数据库也没有的时候,直接缓存一个null,设置比较短的过期时间。
- 请求参数合法性校验:缓存穿透有一部分原因是非法攻击,可以对请求参数等做合法性校验。防止查缓存和数据库。
- 布隆过滤器
缓存雪崩
某一时刻或某个时间段,大量缓存数据共同过期,导致请求大量打到数据库上。或者由于分布式缓存节点故障导致缓存失效。 解决方案:
- 过期时间设置随机值:避免大量缓存同时间过期。
- 加锁或使用队列:用锁或队列将请求排队。
- redis集群:使用redis集群部署。
