诚之和:诚之和:谈谈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);                // 将数据更新到redis                setDataToRedis(key,value);            }            return data;        } catch (Exception e){
            e.printStackTrace();            throw e;        } finally {            // 解锁
            lock.unlock();        }    }

穿透和击穿的区别

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

  • 穿透 :大量请求了缓存和数据库中都没有的数据,每次都查询数据库,导致数据库压力过大

  • 击穿 : 大量key在同一时间过期,导致所有请求都达到数据库,导致数据库压力过大

雪崩效应

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

(0)

相关推荐

  • Redis和Memcache有什么区别?Python基础

    Redis和Memcache的区别?Redis即远程字典服务,是一个开源的使用ANSI C语言编写的.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,提供多种语言的API;Memca ...

  • redis概述

    缓存是如何实现高性能的 当第一次查询的时候,缓存里面没有数据,回去数据库查,然后存入缓存,当再去查询的时候,或者是查询相同数据的时候,就不用去数据库里面查了,直接去缓存里面找,大大提高了效率,如果这个 ...

  • 编程语言卧槽!缓存的问题太多了(雪崩、击穿、穿透…)一个个解决!

    作者:温安适 来源:https://my.oschina.net/floor/blog/4964676 引言 一个超级疲惫的下午,离下班还有30分钟,小航拿了一袋坚果,对我说:"温哥,来来来 ...

  • redis 读书笔记_1

    Remote Dictionary Service 套接字socket:对网络中不同主机上的应用进程之间进行双向通信的端点的抽象 持久化: 1.作用:防止数据丢失 2.机制: RDB存储(快照--硬盘 ...

  • 缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了

    对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是必不可少的优化方式之一.在实际生产环境中,缓存的使用规范也是一直备受重视的,如果使用的不好,很容易就遇到缓存击穿.雪崩等严重异常情景, ...

  • 缓存穿透、缓存击穿和缓存雪崩

    在Redis缓存中有三个必须要知道概念:缓存穿透.缓存击穿和缓存雪崩. 缓存穿透 那什么是缓存穿透,它就是指当用户在查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存 ...

  • 【江苏】庞昕诚《诚诚月刊》

    诚诚月刊 苏州大学附属吴江学校 四年级 庞昕诚 读后感 阳光明媚.万里无云.碧空如洗的一天,我看了一本书叫七色花,里面的主人公都很勇敢. <七色花>中讲到主人公珍妮偶然得到了一朵七色花,这 ...

  • 【江苏】庞昕诚《​诚诚月报》

    诚诚月报 苏州大学附属吴江学校 四年级 庞昕诚 深秋 南飞的大雁在向人们报信,秋天来了. 秋天的菊花傲然怒放,有红的,有黄的.有白的.红的像火.黄的如金,白的如玉,它们的形状各不相同,有的调皮又可爱, ...

  • 谈谈我对内家透劲的一点见解

    本文原创作者:黄学敏 透劲,顾名思义就是有穿透力的劲.一般来讲与三个条件有关:第一是接触面积的大小,比如刀子越尖穿透力越大.第二是硬度大小,比如同样形状的钢刀与木刀比显然钢刀穿透力更强.第三是接触点上 ...

  • 缓存穿透、缓存并发、热点缓存之最佳招式

    2017-12-27 程超 程序猿DD 程序猿DD 一.前言 我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题: 缓存穿透 缓存并发 缓存失效 缓存穿透 注: ...

  • 谈谈阴历、农历、阳历、公历的区别,捋一捋它们与星座、生肖、生日、节日的关系

    咋看标题,你会蒙圈.时下,很多人都把农历等同于阴历,公历等同于阳历.搞不清阴历农历, 阳历公历的区别,分不清星座.生肖甚至生日.节日等等到底分属哪种历法.在陶氏传人看来,很有必要捋捋清. 一.阴历.阳 ...

  • 【热坛讲堂】谈谈关于灰铸铁和球墨铸铁凝固原理与区别

    教铸在线 热加工行业论坛 昨天 [热坛讲堂]谈谈关于灰铸铁和球墨铸铁凝固原理与区别 铸铁件的最终性能,主要决定于其在凝固过程中形成的组织,例如:灰铸铁的热性能就受其组织中石墨的形态.尺寸和数量的影响, ...

  • 谈谈信息化、数字化、智能化和数智化的区别

    笔者在写文时,常用到信息化.数字化.智能化.数智化等词汇.这些词相似却不同,为防止写文时错用滥用,笔者在这里做了一些查证. 一.从基本定义出发 1.信息化 百度百科显示,"信息"指 ...

  • 【谈谈镜头】通透无比之笑傲江湖 AiNKKOr85/ 1.4s尼康镜

    驴行的路上需要有个好的装备,能拍出自己喜欢的片子,比起那些专业人士,我们就是随性,按自己的愿望,没有追求更好,更好!学无止境,关于摄影,我们也应该多学习一些,多谈谈我们在实践中的感受,今天特邀请本公众 ...

  • 诚之和:如何用php实现缓存类代码

    本篇内容主要讲解"如何用php实现缓存类代码",感兴趣的朋友不妨来看看.本文介绍的方法操作简单快捷,实用性强.下面就让小编来带大家学习"如何用php实现缓存类代码&quo ...