谈谈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. SQL SERVER 架构管理
  2. sql left join 去重_混入了一些奇怪的东西?SQL小技巧之数据去重
  3. lnmp发送测试邮箱失败(亲测正解)
  4. 工程搭建:搭建子工程之搭建实体类模块和lombok插件
  5. c:forEach 如何输出序号
  6. Scrum之 评审会议
  7. IndentationError: expected an indented block --python报错 or IndentationError:unexpected indent
  8. STM32启动过程解析-2.02固件库启动文件分析
  9. [分享]N-Gage QD新手教程
  10. 几个清华和北邮学霸公众号,值得学习
  11. 【feign源码】流程分析
  12. python 怕网页_如何像玩游戏一样学Python?
  13. 简单的超市会员管理系统
  14. 剑指offer 从未到头打印列表
  15. App接入阿里云号码认证服务 一键登录 Java后端服务部分
  16. L. Lifeguards(排序)
  17. JUC系列ReentrantLock
  18. Windows电脑开机蓝屏(1)
  19. 怎么把视频的多个片段分割出来?快速分割视频的方法
  20. win10任务栏透明_Win10原生实现全透明任务栏

热门文章

  1. Linux开机和关机记录查看
  2. Excel中图片的vlookup查找操作
  3. acunetix wvs网站漏洞扫描
  4. 饮水安全在线监测系统,保障饮水安全最后“一千米”
  5. 基于MFC视频播放器
  6. 云计算之 PaaS详解
  7. 山东自考c语言程序设计停考了吗,2019年10月山东自考停考二十多个专业 自考专业停考怎么办...
  8. python脚本怎么运行网页抢座位_某网站抢号脚本(python)
  9. 万佳安联手腾讯云,传统安企开启 AI 新征程 1
  10. 解决typora图片丢失问题