文章目录
- 缓存雪崩
- 缓存击穿
- 缓存穿透
在实际的业务场景中,Redis 通常作为缓存和其他数据库(例如 MySQL)搭配使用,用来减轻数据库的压力。但是在使用 Redis 作为缓存数据库的过程中,可能会遇到一些常见问题,例如缓存穿透、缓存击穿和缓存雪崩等。
缓存雪崩
缓存雪崩是指缓存中大批量的 key 同时过期,于是大量请求访问数据库,从而导致数据库压力激增,甚至引起数据库宕机,这种现象被称为 “缓存雪崩”。
避免缓存雪崩的措施有:
- 给缓存数据设置不同的过期时间,避免同时过期;
- 利用 Redis 集群提高服务可用性,避免因 Redis 宕机引起的缓存雪崩;
- 给缓存业务添加降级限流策略;
- 使用多级缓存架构,分散缓存失效的影响。
缓存击穿
如果 Redis 中一个被高并发访问并且缓存重建业务较复杂的 Key 突然失效,那么大量请求将直接访问数据库,从而瞬间给数据库造成巨大冲击。这种现象被称为 “缓存击穿”。
避免缓存击穿的措施有:
-
使用互斥锁:
当缓存未命中时,通过互斥锁方式,确保只有一个线程访问后端存储获取数据,并重建缓存,其他线程保持排队等待。
优点:没有额外内存消耗(不需要设置逻辑过期数据);保证数据库数据与缓存数据的一致性;
缺点:线程需要等待,性能受影响;当多个线程需要竞争多把锁时,可能会有死锁风险。
-
逻辑过期:将缓存