缓存穿透,缓存击穿,缓存雪崩

1. 缓存穿透

定义:缓存穿透是指查询一个数据库和缓存中都不存在的数据,导致每次查询都直接请求到数据库,从而给数据库带来巨大压力。

原因:

  • 恶意攻击,故意查询不存在的数据。

  • 业务层设计不合理,导致用户查询的数据在数据库和缓存中都不存在。

解决方案:

  • 布隆过滤器:在查询缓存之前,使用布隆过滤器判断数据是否存在,如果数据不存在,则直接返回,不进行数据库查询。

  • 空值缓存:对于不存在的数据,也在缓存中存放一个空值(注意设置较短的过期时间),从而避免对数据库的重复查询。

  • 接口限流:对查询接口进行限流,限制恶意查询的频率。

2. 缓存击穿

定义:缓存击穿是指缓存中的某个热点数据(通常是访问量非常高的数据)在某个时间点过期,此时若有大量并发请求访问这个数据,就会直接请求到数据库,导致数据库压力骤增。

原因:

  • 缓存中的热点数据过期。

解决方案:

  • 设置热点数据永不过期:对于热点数据,可以设置为永不过期,然后定期更新缓存。

  • 互斥锁:在访问数据库时,使用互斥锁(如Redis的SETNX命令)保证只有一个线程能够访问数据库,其他线程等待锁释放后从缓存中获取数据。

  • 逻辑过期:在缓存中存储数据时,不设置过期时间,而是在数据访问时检查数据的逻辑过期时间,如果数据逻辑过期,则更新缓存数据。

3. 缓存雪崩

定义:缓存雪崩是指缓存中大量数据同时过期,导致大量请求直接访问数据库,从而给数据库带来巨大压力,甚至导致数据库宕机。

原因:

  • 缓存中大量数据同时过期。

  • 缓存服务器宕机。

解决方案:

  • 随机过期时间:在设置缓存过期时间时,给每个数据设置一个随机的过期时间,避免大量数据同时过期。

  • 缓存预热:在系统启动或低峰期时,预先将热点数据加载到缓存中,避免用户请求时直接访问数据库。

  • 多级缓存:使用多级缓存架构,如本地缓存+分布式缓存,即使分布式缓存失效,本地缓存也能提供一定的数据支持。

  • 限流降级:在数据库前增加限流措施,限制访问数据库的请求量,同时对于非核心服务进行降级处理,释放系统资源以保证核心服务的稳定。

通过上述措施,可以有效缓解缓存穿透、缓存击穿和缓存雪崩等问题,提高系统的稳定性和性能。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!