外观
Redis 中的缓存击穿、缓存穿透和缓存雪崩是什么
缓存击穿
- 定义:指在高并发场景下,某个热点数据在缓存中突然过期失效,导致大量并发请求瞬间绕过缓存,直接访问数据库,给数据库带来巨大压力,甚至可能导致数据库崩溃。
- 原因:一方面是热点数据设置了过期时间,当缓存失效时大量请求并发访问;另一方面是高并发场景下,在缓存失效瞬间大量请求同时到达。
- 示例:电商平台的秒杀商品,在缓存中的商品详情数据过期时,大量用户的请求会同时绕过缓存,直接查询数据库,造成数据库短时间内承受大量并发查询压力。
缓存穿透
- 定义:指请求的数据在缓存和数据库中都不存在,导致请求每次都直接穿透缓存层,到达数据库进行查询,使缓存失去作用,增加数据库压力。
- 原因:可能是恶意攻击,攻击者故意请求大量不存在的数据,绕过缓存冲击数据库;也可能是用户误操作,请求了数据库中确实不存在的数据。
- 示例:用户请求一个 ID 为负数或根本不存在的商品信息,缓存中没有,数据库中也无记录,系统每次都需访问数据库查询,且结果不会被缓存,重复请求会对数据库造成很大压力。
缓存雪崩
- 定义:指在某个特定时间段内,缓存中的大量数据同时过期失效,或者缓存服务器发生故障宕机,导致大量请求无法从缓存获取数据,而直接访问数据库,使数据库压力骤增,甚至可能引发数据库崩溃。
- 原因:一是大量缓存数据在同一时间段过期,例如误配置或缓存服务器故障导致数据无法及时更新;二是缓存服务器遇到故障或宕机,所有请求只能直接访问数据库。
- 示例:电商平台大促活动后,大量商品的缓存数据集中在活动结束后的某个时间点过期,此时若有大量用户访问商品数据,所有请求都会落到数据库上,导致数据库请求量暴增。