redis-击穿、穿透、雪崩

cache框架的具体使用

缓存问题:击穿、穿透、雪崩

在引入缓存层的系统中,击穿、穿透、雪崩是常见的缓存问题。它们本质上都是指请求绕过缓存层,直接访问数据库,导致数据库压力骤增甚至崩溃的情况。以下是对这些问题的详细解释及解决方案。


1. 缓存穿透

定义
缓存穿透是指请求的数据在缓存和数据库中都不存在,导致每次请求都直接落到数据库上。这种情况通常由恶意请求或程序错误引发。

原因

  • 恶意请求:攻击者故意请求不存在的 key。
  • 程序错误:代码逻辑问题,生成了无效或不存在的 key。

解决方案

  • 布隆过滤器:在缓存层前增加布隆过滤器,预先判断 key 是否存在。如果布隆过滤器返回不存在,则直接返回空结果,避免查询数据库。
  • 缓存空值:对于查询不到的数据,缓存一个空值(如 null),并设置较短的过期时间,防止频繁查询数据库。
  • 参数校验:在接口层增加参数合法性校验,过滤无效请求。
  • 黑名单机制:设定合理的阈值,当某个 IP 的请求频率超过阈值时,将其加入黑名单,限制访问频率或直接拒绝请求。

2. 缓存击穿

定义
缓存击穿是指某个热点 key 在缓存中突然失效(如过期或被删除),导致大量请求直接访问数据库。这种情况通常发生在高并发场景下。

原因

  • 缓存过期:缓存中的数据超过了设定的过期时间。
  • 主动删除:缓存中的数据被主动删除,例如在更新数据库后未及时更新缓存。

解决方案

  • 互斥锁:当缓存失效时,使用互斥锁(如分布式锁)保证只有一个请求去加载数据,其他请求等待缓存更新后再读取。
  • 永不过期策略:对热点 key 设置永不过期,通过后台异步更新缓存数据。
  • 缓存预热:在系统启动时或高峰期前,提前加载热点数据到缓存中。
  • 异步加载:当缓存未命中时,异步加载数据并更新缓存,避免所有请求同时访问数据库。

3. 缓存雪崩

定义
缓存雪崩是指大量缓存 key 在同一时间失效,导致大量请求直接访问数据库,造成数据库压力剧增甚至崩溃。这种情况通常由缓存过期时间设置不合理或突发高并发请求引发。

原因

  • 缓存过期时间集中:多个缓存 key 设置了相同的过期时间,导致同时失效。
  • 突发高并发:短时间内大量请求同时访问数据库。

解决方案

  • 随机过期时间:为缓存 key 设置随机的过期时间,避免大量 key 同时失效。
  • 限流降级:在高并发情况下,使用限流和降级策略,限制请求频率,保护数据库。
  • 缓存预热:在系统启动时或定期预热缓存,提前加载常用数据。
  • 多级缓存:使用多级缓存策略(如本地缓存 + 分布式缓存),减少对数据库的直接访问。

个人理解总结

  • 缓存穿透:查询不存在的数据,缓存和数据库都没有,导致每次请求都落到数据库。解决方案包括布隆过滤器、缓存空值等。
  • 缓存击穿:某个热点 key 突然失效,大量请求直接打到数据库。解决方案包括互斥锁、永不过期策略等。
  • 缓存雪崩:大量 key 同时失效,导致数据库压力过大。解决方案包括随机过期时间、多级缓存等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值