首页 > 数据库 >Redis缓存雪崩,击穿和穿透

Redis缓存雪崩,击穿和穿透

时间:2022-11-18 14:22:46浏览次数:31  
标签:缓存 请求 过期 数据库 Redis 访问 雪崩 数据

这三个问题的发生,会导致大量的请求直接积压到数据库,如果并发量很大,则可能会导致数据库宕机或故障。

缓存雪崩

  描述:大量的请求无法在redis缓存中进行处理而被发送到数据库,导致数据库压力陡增。

  产生的原因:

    1. redis缓存中大量的数据同时到期,导致大量请求无法在缓存中得到处理。

      解决方案:

        a.微调过期时间。避免给大量的数据设置相同的过期时间,如果业务一定需要这些数据同时过期,可以在设置过期时间的时候,给这些过期时间增加一个较小的随机数(如1-3分钟),这样不同数据的过期时间有所差别但差别也不是很大。

        b.服务降级。雪崩发送时,针对不同的数据采取不同的措施。

          (1)非核心数据(如电商商品的属性),暂时停止从缓存获取数据,而且返回预定值,空值或者异常信息。

          (2)核心数据,仍然允许查询缓存,缓存中没有则从数据库获取。

    2. redis缓存实例发送故障宕机导致无法处理缓存查询请求,使请求积压到数据库层。

      解决方案:

        a. 在业务系统中实现服务熔断或者请求限流。通过监控负载指标发现雪崩现象的发生,然后启动熔断机制,暂停业务应用对缓存服务的接口访问。而限流则是,在发现雪崩时,限制并发请求数量的访问,如限制到1000,多余的拒绝来降低底层数据库的访问压力。

        b.事前预防,构建可靠的redis缓存集群。主节点宕机了,将从节点切换至主节点,继续提供缓存服务。

缓存击穿

  描述:针对某个热点数据的频繁访问请求无法在缓存中得到处理,大量请求发送到数据库,数据库访问压力陡增,影响其他访问请求

  产生的原因:该种问题多发于热点数据过期访问失效的场景。

  解决方案:对于此类热点数据不设置过期时间

缓存穿透

  描述:要访问的数据既不在缓存中,也不在数据库中。导致请求在访问缓存时,缓存缺失,在访问数据库时,数据库中也没有要访问的数据。

  产生的原因:

    1. 业务层误操作,缓存中和数据库中的数据被删除了,所以导致都访问不到

    2. 恶意攻击,专门访问数据库中没有的数据,如查询id为-1的数据。

  解决方案:

    1. 缓存空值或者缺省值。发送此类情况时,可以在redis中缓存一个空值或者缺省值(如默认为0),后续访问可以从redis获取而不是到数据库

    2. 使用布隆过滤器先判断数据是否存在,来避免从数据库中查询是否存在,减轻数据库的压力。

      布隆过滤器介绍:

        描述:布隆过滤器由一个初始值为0的bit数组和N个哈希函数组成

        操作流程:

          (1)使用N个哈希函数分别计算这个数据的哈希值,得到N个哈希值

          (2)把N个哈希值对bit数组的长度取模,得到每个哈希值在数组中的对应位置。

          (3)最后把对应位置的bit位设置为1,完成布隆过滤器中标记数据的操作。

        使用方法:查询某个数据时,使用上面的计算流程,计算该数据在bit数组中所有对应的位置,只要有一个位置不为1,就表明该数据未被标记过,则不去执行数据库的查询操作。

      3. 前端请求检测,主要检测请求的合法性,包括请求参数是否合理,请求参数是否是非法值,请求字段是否存在等。

标签:缓存,请求,过期,数据库,Redis,访问,雪崩,数据
From: https://www.cnblogs.com/hengw/p/16902971.html

相关文章

  • 四、Redis企业实战 - 优惠劵秒杀
    在喧嚣之外孤单戒掉廉价的浪漫全局唯一ID生成每个店铺都可以发布优惠券,当用户抢购时,就会生成订单并保存到tb_voucher_order这张表中。而订单表如果使用数据库自增I......
  • Redisson在SpringBoot的使用配置
    本文介绍如何在SpringBoot中配置Redisson官网网址redisson-spring-boot-starter配置方案:redisson/redisson-spring-boot-starteratmaster·redisson/redisson·Git......
  • Redis学习(二)之redis中的数据类型之String类型
     1、可以用来存储html碎片或者页面。2、可以通过set、get来操作。3、value最大512M。  1、setkeynewvaluenx 如果后面加了nx,则只在key不存在时,才对key进......
  • redis 缓存高可用集群
    redis集群方案比较哨兵模式在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点状态,如果master节点异常,则会做主从切换,将某一台salve作......
  • Redis持久化
    Redis持久化使用Redis作为数据缓存,缓存的目标主要是那些需要经常访问的数据,或计算复杂而耗时的数据。缓存的效果就是减少了数据库读的次数,减少了复杂数据的计算次数,从而提......
  • springboot 连接 redis 超时以及无法连接的解决方案
    连接的时候遇到了两个问题:一是超时,二是连接不上。网上看到了很多方法,但是比较杂乱,新手不是很懂问题出在哪里,所以写了一下自己的解决问题的心得。超时超时的原因:1.保护模......
  • nginx高并发优化之缓存配置
    一、配置http{proxy_cache_path/app/cache/levels=1:2keys_zone=proxy_cache:10mmax_size=10ginactive=60muse_temp_path=off;upstreambackend{server127......
  • predis 参数说明手册
    发布订阅<?php/**ThisfileispartofthePredispackage.**(c)DanieleAlessandri<[email protected]>**Forthefullcopyrightandlicensein......
  • Redis缓存中的数据和数据库不一致
    首先关于两者数据的一致性包含有两种情况:(1)缓存中有数据时,那数据库中的数据要和缓存中的数据相同;(2)缓存中没有数据时,数据库中的数据必须是最新的。如果不符合以上两种......
  • 12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?
    本文已收录到 GitHub·AndroidFamily,有Android进阶知识体系,欢迎Star。技术和职场问题,请关注公众号[彭旭锐]进Android面试交流群。前言大家好,我是小彭。在......