缓存击穿 缓存穿透 缓存雪崩
1. 缓存击穿 (Cache Breakdown)#
缓存击穿是指在高并发场景下,某个热点数据(经常被访问的数据)的缓存突然失效(例如过期),导致大量请求同时直接访问数据库或其他后端服务。由于数据库的处理能力有限,这种突发的高并发请求可能会压垮数据库。
怎么避免?
热点缓存延长有效期或不过期
- 对于访问频率很高的热点数据,可以设置缓存永不过期,或者延长缓存时间,避免频繁失效
- 通过后台异步任务定期更新缓存数据
异步刷新缓存
- 在缓存即将过期时,提前异步刷新缓存,而不是等到失效再加载
- 例如,设置一个后台任务,在缓存过期前 1 分钟主动刷新
2. 缓存穿透 (Cache Penetration)#
缓存穿透是指查询一个不存在的数据,由于缓存中没有该数据(即缓存未命中),请求会直接穿透到数据库。而数据库中也没有该数据,大量的这种请求会导致数据库压力过大。
- 用户查询一个不存在的商品 ID(如 ID = -1)
- 缓存中没有这个 ID,请求直接访问数据库,数据库返回空
- 高并发下,大量无效查询直接打到数据库,导致性能问题
怎么避免?
缓存空结果
- 对于查询不存在的数据,将“空结果”也缓存起来,并设置一个较短的过期时间(如 1 分钟)
- 这样后续相同请求会直接命中缓存,不会穿透到数据库
加强参数校验
- 在 API 层对 key 进行校验,如 ID 是否符合格式、是否在合理范围内,避免无效请求进入数据库。
查看其他文章