• Linux之Redis 缓存雪崩,击穿,穿透


    1、缓存雪崩

     1.1 造成原因

           、 简单来说就是当时设计缓存时存在问题,导致大部分缓存数据在相同时间内,大量过期。这样就会把压力全部给了数据库。

            二、Redis 缓存实例发生故障宕机。

    1.2 解决方案

    1、解决热点数据集中失效

    针对大量数据集中失效带来的缓存雪崩问题,可以用下面几种方案解决:

    •     均匀过期:给热点数据设置不同的过期时间,给每个key的失效时间加一个随机值;
    •     设置热点数据永不过期:不设置失效时间,有更新的话,需要更新缓存;
    •     服务降级:指服务针对不同的数据采用不同的处理方式:
    1.         业务访问的是非核心数据,直接返回预定义信息、空值或者报错;
    2.         业务访问核心数据,则允许访问缓存,如果缓存缺失,可以读取数据库。

    2、解决Redis实例宕机问题

    方案一: 实现服务熔断或者请求限流机制
            我们通过监测Redis以及数据库实例所在服务器负载指标,如果发现Redis服务宕机,导致数据库的负载压力增大,我们可以启动服务熔断机制,暂停对缓存服务的访问。

    但是这种方法对业务应用的影响比较大,我们也可以通过限流的方式降低这种影响。

    举个例子:比如业务系统正常运行时,请求入口每秒最大允许进入的请求数是1万个,其中9000请求个可以被缓存处理,余下1000个会发送给数据库处理。

    一旦发生雪崩,数据库每秒处理的请求突然增加到1万个,此时我们就可以启动限流机制。在前端请求入口处,只允许每秒进入1000个请求,其他的直接拒绝掉。这样就可以避免大量并发请求发送给数据库。

    方案二:事前预防
            通过主从节点的方式构建 Redis 缓存高可靠集群。 如果 Redis 缓存的主节点故障宕机了,从节点还可以切换成为主节点,继续提供缓存服务,避免了由于缓存实例宕机而导致的缓存雪崩问题。

    2、缓存穿透

    2.1 造成原因

            缓存穿透指用户要访问的数据既不在缓存中也不在数据库中,导致用户每次请求该数据时都要去数据库查一遍,然后返回空。如果有恶意攻击者不断请求这种系统不存在的数据,会导致数据库压力过大,严重会击垮数据库。

    2.2 解决方案

    •     接口层增加校验:用户鉴权、参数校验(请求参数是否合法、请求字段是否不存在等等);
    •     缓存空值/缺省值:发生缓存穿透时,我们可以在Redis中缓存一个空值或者缺省值(例如,库存缺省值为0),这样就避免了把大量请求发送给数据库处理,保持了数据库的正常运行。这种方法会存在两个问题:
    •         如果有大量的Key穿透,缓存空对象会占用宝贵的内存空间。针对这种情况可以给空对象设置过期时间。设置过期时间之后,可能会有缓存与数据库不一致的情况。
    •     布隆过滤器:快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库压力。
       

    3、缓存击穿

    3.1 造成原因

            某个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,导致数据库存在被打挂的风险。

    3.2 解决方案

    1.加互斥锁。当热点key过期后,大量的请求涌入时,只有第一个请求能获取锁并阻塞,此时该请求查询数据库,并将查询结果写入redis后释放锁。后续的请求直接走缓存。

    2.设置缓存不过期或者后台有线程一直给热点数据续期(redission)。

     

  • 相关阅读:
    推荐几款优秀的项目报表软件
    Nginx概念
    【go零基础】go-zero从零基础学习到实战教程 - 1项目表设计
    计算机毕业设计ssm+vue基本微信小程序的客户资源管理系统
    求圆心到点的直线与圆的相交点
    流行的 Web 框架安全性比较
    使用JMeter创建FTP测试计划
    SpringBoot核心以及工作机制
    企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
    chatGPT的前世今生
  • 原文地址:https://blog.csdn.net/qq_41720578/article/details/126149113