缓存击穿、缓存穿透和缓存雪崩是与缓存相关的一些常见问题,具体定义如下:
- 缓存击穿:指当一个缓存键(key)对应的数据在缓存中不存在,同时又有大量并发请求访问该缓存键时,这些请求会直接绕过缓存,查询数据库或其他存储系统,导致数据库压力增大。缓存击穿通常在缓存过期后发生。
- 缓存穿透:指当一个查询请求访问一个不存在于缓存中且也不存在于数据库中的数据时,这个请求会无效地继续访问数据库,而不会被缓存。如果黑客故意发送大量非法请求,则缓存层无法起到过滤作用,可能导致数据库负载过大。
- 缓存雪崩:指当缓存集中在某个时间点失效或由于某个原因发生故障,导致大量的请求直接打到后端数据库,造成数据库瞬时压力过大,甚至引起数据库崩溃。在缓存雪崩期间,系统性能急剧下降,无法正常提供服务。
为了应对以上问题,可以采取以下措施:
- 对热点数据采用永不过期策略,避免缓存击穿。
- 在缓存层进行空值缓存,即将查询结果为空的数据也缓存一段时间,避免缓存穿透。
- 设置合理的缓存过期时间,并使用分布式缓存的多节点部署,避免缓存雪崩。
- 引入限流、熔断等机制,控制并发访问量,保护后端系统。
- 对重要数据做冷备份,确保即使缓存失效或故障,仍能从其他系统中恢复数据。