• Redis缓存的雪崩、穿透、击穿


    前言:
    使用缓存的主要目的是为了提高系统的响应速度、减轻数据库的压力。那么一个正常的缓存流程是怎样的呢,看下如下步骤:
    1、用户发起查询请求
    2、请求来到redis缓存,在缓存中查询到了数据,将缓存中查询到的数据返回给用户
    3、缓存中不存在则到数据库查询,返回给用户
    4、把数据库中查询到的数据写入缓存,以后后续查询使用


    一、缓存雪崩
    1、什么是缓存雪崩?
    例如每年双十一,全国大量用户访问某电商平台,这个时候 redis 里面的热点 key 大量同一时间失效,导致这个平台直接访问数据库,把大量的请求都打到数据库,这种现象就是缓存雪崩。
    简单来说就是 redis 缓存大量 key 在同一时间失效,就像这个雪崩来了一样


    2、解决方案
    【1】在设置这个缓存的时候,可以将 key 的失效时间分散开,不让大量的 key 在同一时间失效
    【2】还有就是比较暴力的方法,不设置这个缓存失效的时间,让 key 永不失效,或者将 key 的过期时间设置的较长


    二、缓存穿透
    1、什么是缓存穿透?
    【1】大家都知道数据表主键一般都是从1开始的增量正数,或是特殊算法生成的字符串,这种情况下如果有恶意攻击发起请求,查询 where id = -1、-2、-3、... 这样的数据,缓存中肯定是没有这样数据的,就到数据库里面查询,也没有查到该条数据,只能返回空数据给前端了
    【2】如果某个恶意用户用脚本不断的发这样的请求,直接穿透 redis 打到数据库上,那么所有请求都会打到数据库,而且会一直打到数据库中去,因为 redis 缓存这层根本拦截不到这样的数据,这就是所谓的缓存穿透
    【3】简单来说,缓存穿透就是指缓存中没有查询的数据,缓存拦截不到,请求都打到了数据库上


    2、解决方案
    【1】对请求的参数做合法性校验
    【2】数据库无论查出什么结果(无论为不为空),都写入 redis 缓存里面,这样下次用同一个参数发来请求的时候,就直接被 redis 缓存拦截掉了,就不回打到数据库了
    【3】使用布隆过滤器,这是一个非常好的方式


    三、缓存击穿
    1、什么是缓存击穿?
    某一个非常热点的 key,在大量的用户请求不断的访问这个热点的 key,当这个热点的 key 突然失效,把请求都打到数据库上,这个过程就是叫做缓存击穿。记住它是击穿某个一个非常热点的 key


    2、解决方案
    【1】设置这个热点 key 不过期,即不设置失效时间(不推荐)
    【2】使用分布式锁,如果是单体应用使用互斥锁


    总结:
    缓存雪崩:是指大量的缓存热点 key,在同一时间大量的失效,海量请求打到数据库
    缓存穿透:是指 redis 缓存里没有查询到想要的数据,直接穿过 redis 打到数据库了
    缓存击穿:是指某个一个非常热点的 key,大量的用户去请求这个缓存热点 key,当这个缓存 key 突然失效的时候,这些请求都会打到数据库上

  • 相关阅读:
    腾讯基础面
    Java中的枚举类型——Enum
    蓝桥杯官网练习题(旋转)
    【附代码】使用Shapely计算多边形外扩与收缩
    MongoDB
    随机森林、AdaBoost 和 XGBoost 三者之间的主要区别
    关于新增字段我们应该测试什么?
    【计算机网络笔记五】应用层(二)HTTP报文
    漫谈固态硬盘SSD全生命周期的质量管理
    83 # 静态服务中间件 koa-static 的使用以及实现
  • 原文地址:https://blog.csdn.net/hkl_Forever/article/details/128024097