当前位置: 首页 > news >正文

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 突然失效的时候,这些请求都会打到数据库上

相关文章:

  • 腾讯云COS+PicGo+Typora十分钟搭建自己的图床
  • 第十四届蓝桥杯(Web应用开发)模拟赛1期-大学组
  • js逆向tips-某思录登录
  • 为了摸鱼,我开发了一个工具网站
  • OpenCV图像处理——(实战)答题卡识别试卷
  • 朋友电脑密码忘了,我当场拔了她的电源,结果。。。
  • SpringBoot: Controller层的优雅实现
  • LeetCode135. 分发糖果(贪心算法)
  • c语言:初识结构体
  • ASEMI肖特基二极管SBT40100VFCT规格,SBT40100VFCT封装
  • 谁能拒绝一个会动的皮卡丘挂件
  • docker 安装minio
  • 云原生系列 五【轻松入门容器基础操作】
  • Python - 异常处理
  • 经济师十大专业通过人数分析!选专业有谱了!
  • wpf布局学习二 wpf xaml 与android xml界面对比, C++图片旋转与缩放好复杂放弃
  • C语言百日千题系列之《忘情水题》第一日
  • CNN经典模型之ALexNet、ResNet、DenseNet总结和比较
  • 什么是固话号码认证?固话号码认证有用吗?
  • select......for update会锁表还是锁行?