Redis缓存穿透、击穿、雪崩的发生原因及解决方式

Java面试 潘老师 8个月前 (09-06) 175 ℃ (0) 扫码查看

Redis缓存问题的发生原因以及解决方式通常可以分为三种情况:

1. 缓存穿透(Cache Penetration)

原因

客户端查询不存在的数据,导致请求直接到存储层,增加负载甚至导致宕机。可能是由于业务误删除缓存或恶意攻击而导致。

解决方式

a. 缓存空对象:当存储层未命中后,仍将空值存入缓存层,客户端再次访问时直接返回空值。

b. 布隆过滤器:在访问缓存之前使用布隆过滤器拦截请求,如果数据不存在则直接返回空值。

2. 缓存击穿(Cache Breakdown)

原因

热点数据缓存失效瞬间,大量请求直达存储层,导致服务崩溃。

解决方式

a. 不设置过期时间:对热点数据不设置过期时间,实现“物理”上的永不过期。

b. 逻辑过期时间:为每个数据设置逻辑过期时间,当数据逻辑过期时,使用单独的线程重建缓存。

c. 互斥锁:对数据访问加互斥锁,一个线程访问数据时,其他线程等待,访问后重建缓存,其他线程可以直接从缓存中取值。

3. 缓存雪崩(Cache Avalanche)

原因

缓存中大量数据同时过期或Redis节点故障,导致所有请求直达存储层,可能导致数据库宕机。

解决方式

a. 随机过期时间:在设置过期时间时附加一个随机数,避免大量键同时过期。

b. 降级和熔断:发生雪崩时,若访问的不是核心数据,可以直接返回预定义信息/空值/错误信息,或者对于缓存接口的请求直接返回,不访问Redis。

c. 高可用的Redis服务:部署多个Redis实例,使用哨兵或集群模式,即使某个节点宕机,服务仍然保持可用。

这些解决方式可以根据具体情况选择和组合,以确保缓存系统的可靠性和性能。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/javainterview/8837.html
喜欢 (1)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】