Redis数据库——Redis雪崩、穿透、击穿

[复制链接]
发表于 2025-11-14 07:20:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本文先扼要先容为什么须要利用Redis,以及逾期键的删除计谋,进而具体先容Redis雪崩、穿透、击穿的发生场景和办理方案。
  

   
  
  前情提要

为什么利用redis?


  • 进步性能:缓存査询速率比数据库查询速率快(内存Vs硬盘);
  • 进步井发本领:缓存分担了部门哀求,支持更高的并发。
Redis 的逾期键删除计谋

Redis 为管理内存,对设置了逾期时间的键接纳了以下三种删除计谋:

  • 定时逾期:

    • 形貌:为每个设置了逾期时间的键创建一个定时器,到达逾期时间立刻打扫。
    • 长处:对内存很友爱,逾期数据能及时打扫。
    • 缺点:须要斲丧大量的 CPU 资源来处理惩罚定时器,影响缓存相应时间和吞吐量。

  • 惰性逾期:

    • 形貌:只有在访问某个键时才判定其是否逾期,逾期则打扫。
    • 长处:最大化节省 CPU 资源。
    • 缺点:大概会有大量逾期键未被访问而占用内存。

  • 定期删除:

    • 形貌:每隔肯定时间扫描 expires 字典中的部门键,打扫逾期键。
    • 长处:折中计谋,通过调解扫描时间隔断和每次扫描数量,平衡 CPU 和内存资源。

默认利用惰性逾期 (Lazy Expiration)和定期删除 (Periodic Deletion)两者团结的方式,可以或许在性能和内存利用之间找到一个良好的平衡。
数据读取流程

Redis 的数据读取通常遵照以下步调:

  • 缓存掷中:如果数据在缓存中存在,直接从缓存中读取。
  • 缓存未掷中:如果缓存中没有数据,则查询数据库,获取数据后写入缓存供下次利用。
三种题目及办理方案



  • 缓存雪崩:告急办理缓存大规模失效题目,焦点在于错峰和高可用。
  • 缓存穿透:告急办理哀求不存在数据的题目,焦点在于布隆过滤器和空值缓存。
  • 缓存击穿:告急办理热门数据失效题目,焦点在于互斥锁和逻辑逾期。
1. 缓存雪崩

界说:在某一时间段内,缓存会集逾期或 Redis 服务宕机,导致大量哀求直接涌向数据库,大概引发数据库瓦解。
缘故起因:
内存昂贵且有限,以是Redis须要给数据设置逾期时间,将逾期键数据删除。


  • 缓存中的大量数据设置了雷同的逾期时间,导致会集失效。
  • 缓存服务宕机或瓦解,全部缓存失效。
办理方案:

  • 键值——缓存失效时间错峰:

    • 给缓存的逾期时间增长一个随机值,镌汰同一时间段的缓存同时逾期。
    1. SET key value EX 300 + random(60)  # 过期时间加随机值
    复制代码

  • 事发前——Redis 高可用架构

    • 实现 Redis 主从架构或 Redis Cluster,克制单点故障。
    • 利用 Sentinel(哨兵)举行故障转移,只管克制Redis挂掉这种情况发生。

  • 事发中——当地缓存和限流

    • 在 Redis 宕机时,启用当地缓存(如 Ehcache)。
    • 通过限流(如 Hystrix)掩护数据库(最少能包管我们的服务照旧能正常工作的)。

  • 事发后——Redis 长期化

    • 开启 RDB 或 AOF 长期化,重启后主动从磁盘上加载数据,快速规复缓存数据。


2. 缓存穿透

界说:用户哀求的键在缓存和数据库中都不存在,导致每次哀求都会直接访问数据库。
   为什么说键在数据库中也不存在呢?
由于如果键在数据库中存在,第一次掷中,就会写入缓存,下次就不会哀求到数据库,不属于缓存穿透
  缘故起因:


  • 恶意攻击:通过大量哀求不存在的键对体系举行攻击。比方 ID 为负数或不存在的用户数据。
  • 数据不全:一些正常哀求由于数据未掷中而直接访问数据库。
办理方案:

  • 布隆过滤器:

    • 在缓存前引入布隆过滤器,用于判定哀求的键是否大概存在:

      • 如果布隆过滤器判定不存在,直接返回,无需访问缓存和数据库。
      • 如果布隆过滤器判定大概存在,再访问缓存或数据库。

    1. # 添加数据到布隆过滤器
    2. BF.ADD filter "valid_key"
    3. # 查询数据是否存在
    4. BF.EXISTS filter "invalid_key"  # 返回 false,直接拦截请求
    复制代码

  • 缓存空值:

    • 当查询结果为空时,将空值存入缓存,并设置较短的逾期时间。
    1. SET key "null" EX 60  # 缓存空值 60 秒
    复制代码
          这种情况我们一样寻常会将空对象设置一个较短的逾期时间(时间太长的话,万一数据库中已经有数据了,但是长时间掷中redis发现没有数据,导致用户拿不到数据)。
       
  • 参数校验:

    • 对输入的参数举行校验,克制无效哀求到达后端。

  • 限流防护:

    • 对频仍哀求不存在键的客户端举行限定,防止恶意攻击。


3. 缓存击穿

界说:当缓存中某个高频访问的热门键逾期时,大量哀求同时到达数据库,造成数据库压力骤增。
场景:


  • 一个热门数据被大量访问,且缓存忽然失效,失效后哀责备部打到数据库。
办理方案:

  • 热门键永不外期:

    • 热门键不设置逾期时间,直接通过覆盖更新来保持数据划一性。

  • 加互斥锁:

    • 利用 Redis 或 Zookeeper 的分布式锁,控制只有一个线程能访问数据库并更新缓存,别的线程等候。
    1. SET lock:key "unique_value" NX EX 10  # 设置分布式锁
    复制代码

  • 热门键限流:

    • 对热门键的哀求举行限流,克制短时间内大量哀求涌入。

  • 热门数据分片:

    • 将热门数据分散到差别的 Redis 节点或分布式服务中,镌汰单点压力。


对比总结

题目界说缘故起因办理方案缓存雪崩大量缓存数据同时失效,导致哀求会集打到数据库或服务缓存失效时间划一,缓存服务宕机错峰失效、缓存预热、高可用集群、限流降级缓存穿透哀求的键既不在缓存中,也不在数据库中恶意攻击、数据不全布隆过滤器、空值缓存、参数校验、限流防护缓存击穿热门数据缓存失效时,大量哀求同时查询该数据热门数据失效,大量哀求会集到数据库互斥锁机制、逻辑逾期、哀求分流、分布式限流
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表