谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应

面试经历

在很长的一段时间里,我以为缓存击穿和缓存穿透是一个东西,直到最近去腾讯面试,面试官问我缓存击穿和穿透的区别;我回答它俩是一样的,面试官马上抬起头用他那细长的单眼皮眼睛瞪着我说:“你确定吗?”,最后面试提醒我,既然有不同的名字,那他们肯定就是不一样的,也就是说缓存击穿和缓存穿透不是一个东西;

那么今天我们就看看这俩玩意的区别,以及它们引发的后果;

在项目中加入缓存

一般情况下,我们会把热点数据放到缓存中,比如常用的字典、用户信息、订单详情等等;也就是说,当项目启动后,先将热点数据加载到redis中,以后需要数据时就不用每次都去数据库查询了,这样一来,既减少了数据库的压力,也提升了访问速度,可谓是一举多得呀!

缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

解决方案:

  1. 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短一些,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击

缓存击穿

缓存击穿指的是大量的key在同一时间过期,但是又有大量的请求需要用到这些已经过期的key,那么程序在redis找不到数据,就会去数据库里查询,数据库处理大量的请求的同时导致压力瞬间增大,造成压力过大,甚至导致崩溃;

解决方案

  1. 设置key值永不过期
  2. 将key的过期时间设为随机
  3. 增加互斥锁,当多个key过期时,同一时间只有一个查询请求下发到数据库,其他的key等待一个个地轮流查,就可以避免数据库压力过大的问题;代码如下:
    static Lock lock = new ReentrantLock();public String getData(String key ) throws InterruptedException {try {// 从redis获取值String data =  getRedisData(key);// 如果key不存在,从数据库查询if(null  == data){// 尝试获取锁if(!lock.tryLock()){// 获取锁失败 ,100ms后在次尝试TimeUnit.MILLISECONDS.sleep(100);data = getData(key);}// 走到这里表示成功获取锁// 从myqsl中获取锁data = getMysqlData(key);// 将数据更新到redissetDataToRedis(key,value);}return data;} catch (Exception e){e.printStackTrace();throw e;} finally {// 解锁lock.unlock();}}

穿透和击穿的区别

关于穿透和击穿的区别上面已经介绍的很清楚了,这里在做个总结

  • 穿透 :大量请求了缓存和数据库中都没有的数据,每次都查询数据库,导致数据库压力过大
  • 击穿 : 大量key在同一时间过期,导致所有请求都达到数据库,导致数据库压力过大

雪崩效应

雪崩效应指的是由穿透和击穿引起的数据库压力过大,最后导致整个数据库宕机,一旦数据库崩了,它所带来的连锁反应是可怕的,数据库不可用的情况下你的服务器也无法使用;这就是雪崩效应;

Tags:击穿 缓存 雪崩 谈谈 效应

衣锦夜行 电子书下载_pdf下载_

谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应相关推荐

  1. html 遮罩层穿透问题,移动页面点击穿透问题解决方案

    近期在做页面的时候,遇到了点击遮罩层时穿透下层的checkbox的问题,由于为了兼顾用户的流畅度,只能使用tap事件,click事件虽然解决了穿透的问题,但总会有300ms的延时,因此最终使用sett ...

  2. div阻止点击穿透+实现点击穿透

    一.阻止点击穿透,上层点击时加上下面这句,阻止事件冒泡到父元素 event.stopPropagation(); 二.点击穿透到下面一层,不点击上层,为上层添加下面样式代码即可 pointer-eve ...

  3. 移动端事件 click touch tap swiper 点击穿透的问题

    click事件 click事件在移动端会有200-300ms的延迟,是因为手机上双击屏幕,缩放功能的存在.在手机上打开页面,快速双击时,页面会被放大.所以当你在点击第一次的时候,系统会等200-300 ...

  4. 【342期】SpringBoot + Redis 布隆过滤器防恶意流量击穿缓存的正确姿势!

    什么是恶意流量穿透 假设我们的Redis里存有一组用户的注册email,以email作为Key存在,同时它对应着DB里的User表的部分字段. 一般来说,一个合理的请求过来我们会先在Redis里判断这 ...

  5. SpringBoot+Redis布隆过滤器防恶意流量击穿缓存的正确姿势

    什么是恶意流量穿透 假设我们的Redis里存有一组用户的注册email,以email作为Key存在,同时它对应着DB里的User表的部分字段. 一般来说,一个合理的请求过来我们会先在Redis里判断这 ...

  6. 【Redis】快速掌握:缓存雪崩、穿透、击穿、预热

    目录 前言 一.缓存 1.1.程序中缓存是什么样的? 1.2.缓存的优点 1.3.缓存的分类 二.缓存特性 2.1.缓存雪崩 2.1.1.雪崩问题 2.1.2.如何解决缓存雪崩问题 2.2.缓存穿透 ...

  7. Redis常见面试题(缓存击穿、穿透、雪崩)

    Redis常见面试题(缓存击穿.穿透.雪崩) 击穿 场景: 一般由于redis中的数据到期,同时并发用户特别多,此时大量请求压到数据库上. 解决思路: 根据redis是单进程单实例的特性,当高流量进入 ...

  8. 【redis】redis缓存穿透及解决方案|缓存穿透,缓存击穿,雪崩的理解

    |目录 缓存穿透 解决方案 布隆过滤 缓存空对象 缓存雪崩 解决方案 1.保证缓存层服务高可用性 2.依赖隔离组件为后端限流并降级 3.数据预热 4.做二级缓存,或者双缓存策略. 5.缓存永远不过期 ...

  9. Redis追命连环问,你能回答到第几问?(上)Redis简介,数据类型及缓存雪崩缓存击穿缓存穿透

    Redis常见面试题连环问,你能回答到第几问?(上) Redis常见面试题连环问,你能回答到第几问?(中) Redis常见面试题连环问,你能回答到第几问?(下) Redis是后端工程师必备的一项技能, ...

最新文章

  1. Python中DataFrame关联
  2. 一部手机失窃引发的惊心动魄的战争,你是个合格的程序猿吗?
  3. 数据资产纳入国资保值增值考核
  4. 正则表达式的非捕获性分组
  5. oracle有sysdata,Oracle基础
  6. 计算机操作员理论知识试题,计算机操作员理论考试试题.doc
  7. 说说Javascript
  8. 有关二级菜单缓慢效果出现(transition)
  9. MySQL建表规范与常见问题
  10. qt结合arcgis进行开发
  11. SitePoint播客#115:直播在WordCamp Raleigh第2部分
  12. 咸鱼之王小游戏PC版鼠标模拟器实现
  13. MySQL-5-MySQL的使用
  14. cocos2dx掼蛋_cocos2d/x 自带字体(label)
  15. disallow root login remotely 不起作用?
  16. 计算机博士毕业致谢,这篇博士论文《致谢》刷屏,句句扎心……
  17. android用户界面组件都是放置在,Android开发工程师第十章 节 用户界面高级组件.ppt...
  18. 提交.a文件到svn
  19. 小众又冷门的手帐,居然也是一个非常赚钱的项目
  20. ​2021半年盘点,不想你错过的重磅新书

热门文章

  1. 学生网站模板HTML5+CSS大作业——明星薛之谦(7页面))带轮播特效
  2. cad图纸怎么打印?办公常备软件
  3. 机器学习基础:模型集成/集成学习
  4. BLE中GATT介绍
  5. 【运筹学】运输规划 ( 运输规划问题的数学模型 | 运输问题引入 )
  6. piix4_smbus SMBus Host Controller not enabled
  7. C++中erase()函数
  8. vue 头像上传裁剪功能
  9. mamp mysql启动失败_MAMP pro mysql 启动失败
  10. CSS中border的所有样式属性