2021-02-23 22:17:07
缓存击穿和缓存穿透的核心区别在于触发场景和请求性质不同,前者是热点数据失效后的并发访问问题,后者是恶意或无效请求绕过缓存直接攻击数据库的问题。具体区别如下:
触发场景
缓存击穿:发生在缓存中原本存在但突然失效的热点数据上。例如,某个热门商品信息在缓存中的有效期到期,此时大量用户同时请求该商品信息,由于缓存未及时更新,所有请求直接穿透到数据库。
缓存穿透:发生在缓存和数据库中均不存在的数据上。例如,攻击者通过构造不存在的用户ID(如-1或超长字符串)频繁请求,由于缓存和数据库均无对应数据,每次请求都会直接访问数据库。
请求性质
缓存击穿:请求是合法且高频的,通常由正常用户行为触发(如秒杀活动、热点新闻访问)。
缓存穿透:请求可能是恶意构造的(如攻击者通过自动化工具发送大量无效请求),也可能是爬虫或程序错误导致的无效访问。
对数据库的影响
缓存击穿:短期内大量并发请求直接访问数据库,可能导致数据库瞬时高负载,但影响范围通常限于特定数据。
缓存穿透:由于请求的数据本身不存在,数据库需反复执行查询操作(即使结果为空),可能导致数据库持续高负载,甚至因无效查询占用资源而影响其他正常请求。
解决方案侧重点
缓存击穿:
加锁机制:在缓存失效时,通过互斥锁或分布式锁确保只有一个请求访问数据库,其他请求等待缓存更新后再获取数据。
逻辑过期:为缓存数据设置逻辑过期时间(而非真实过期时间),当数据过期时,后台线程异步更新缓存,避免大量请求同时触发数据库查询。
热点数据预加载:对可能成为热点的数据提前加载到缓存,并设置合理的过期时间。
缓存穿透:
布隆过滤器:在缓存层前添加布隆过滤器,对所有请求的Key进行校验。若Key不存在于布隆过滤器中,则直接返回空值,避免访问数据库。
空值缓存:对数据库查询结果为空的数据也缓存一段时间(如设置较短过期时间),避免重复查询。
请求校验:对请求参数进行合法性检查(如ID范围、格式验证),过滤掉明显无效的请求。
典型案例
缓存击穿:电商平台的秒杀活动中,某商品的库存信息在缓存中过期,大量用户同时请求该商品库存,导致数据库压力激增。
缓存穿透:攻击者通过自动化工具频繁请求数据库中不存在的用户信息(如user_id=-1),导致数据库持续收到无效查询请求。
总结:缓存击穿是热点数据失效后的并发访问问题,需通过加锁或预加载解决;缓存穿透是恶意或无效请求绕过缓存的问题,需通过布隆过滤器或空值缓存防御。两者均需结合业务场景设计合理的缓存策略,以保障系统稳定性。