精华内容
下载资源
问答
  • 面试官:缓存穿透、缓存雪崩和缓存击穿是什么

    千次阅读 多人点赞 2019-08-01 23:39:49
    对于web来说,是用户量和访问量支持项目技术的...页面的并发量显著增多,数据库有些压力,并且有些数据更新频率较低反复被查询或者查询速度较慢。那么就可以考虑使用缓存技术优化。对高命中的对象存到key-value形...

    前言

    原创公众号:bigsai

    对于缓存穿透、缓存雪崩和缓存击穿常常出现在面试中,今天来看看它到底是啥吧?

    在这里插入图片描述
    在这里插入图片描述

    redis缓存穿透

    在这里插入图片描述
    理解

    • 重在穿透吧,也就是访问透过redis直接经过mysql,通常是一个不存在的key,在数据库查询为null。每次请求落在数据库、并且高并发。数据库扛不住会挂掉。

    解决方案

    • 可以将查到的null设成该key的缓存对象。
    • 当然,也可以根据明显错误的key在逻辑层就就行验证
    • 同时,你也可以分析用户行为,是否为故意请求或者爬虫、攻击者。针对用户访问做限制。
    • 其他等等,比如用布隆过滤器(超大型hashmap)先过滤。

    redis缓存雪崩

    理解

    • 雪崩,就是某东西蜂拥而至的意思,像雪崩一样。在这里,就是redis缓存集体大规模集体失效,在高并发情况下突然使得key大规模访问mysql,使得数据库崩掉。可以想象下国家人口老年化。以后那天人集中在70-80岁,就没人干活了。国家劳动力就造成压力。
      在这里插入图片描述

    解决方案

    • 通常的解决方案是将key的过期时间后面加上一个随机数,让key均匀的失效。
    • 考虑用队列或者锁让程序执行在压力范围之内,当然这种方案可能会影响并发量。
    • 热点数据可以考虑不失效

    redis缓存击穿

    理解

    缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,好像蛮力击穿一样。

    在这里插入图片描述

    • 击穿和穿透不同,穿透的意思是想法绕过redis去使得数据库崩掉。而击穿你可以理解为正面刚击穿,这种通常为大量并发对一个key进行大规模的读写操作。这个key在缓存失效期间大量请求数据库,对数据库造成太大压力使得数据库崩掉。就比如在秒杀场景下10000块钱的mac和100块的mac这个100块的那个订单肯定会被抢到爆,不断的请求(当然具体秒杀有自己处理方式这里只是举个例子)。所以缓存击穿就是针对某个常用key大量请求导致数据库崩溃。

    解决方案

    • 可以使用互斥锁避免大量请求同时落到db。
    • 布隆过滤器,判断某个容器是否在集合中
    • 可以将缓存设置永不过期(适合部分情况)
    • 做好熔断、降级,防止系统崩溃。

    原创公众号:「bigsai」,回复bigsai获取8G pdf资源!

    在这里插入图片描述

    展开全文
  • 所以不少人在去买硬盘的时候,都不考虑其他的只一昧跟营业员说要缓存大的。可是这样做到底对不对?真的硬盘缓存越大越好吗?不要着急,下面我们来详细聊聊硬盘缓存的作用。 硬盘的缓存主要作用 硬盘缓存的作用 为了...

    大家都知道硬盘对电脑来说比较重要的,因为硬盘可以储存许多重要的东西。因而大家一致认为硬盘缓存越大越好,因为他们认为硬盘缓存大了,电脑的运行速度就会变快。所以不少人在去买硬盘的时候,都不考虑其他的只一昧跟营业员说要缓存大的。可是这样做到底对不对?真的硬盘缓存越大越好吗?不要着急,下面我们来详细聊聊硬盘缓存的作用。

    在这里插入图片描述
    硬盘的缓存主要作用

    硬盘缓存的作用

    为了平衡高速设备和低速设备之间的速度差异而存在的。举个最简单的例子,内存中的数据要写入机械硬盘保存,由于机械硬盘相比内存要缓慢许多,理论上就需要很长的时间才能完成任务,体现出来的结果就是写入超级慢。

    要解决这种速度上的差异(内存速度与硬盘速度),就需要在之间做一个“缓冲区”来暂存数据,这就是硬盘缓存的作用。不过需要注意的是,其实硬盘的缓存并不全都用于缓存数据,还有其他用途,所以不见得缓存越大,性能就越好。
    在这里插入图片描述
    固态硬盘的缓存

    相比刚刚说的机械硬盘,固态硬盘速度要高不少,但是对比内存还是慢得多。固态硬盘的缓存一般都是由一到两颗DRAM颗粒(说白了就是内存用颗粒)作为缓存使用。早先固态硬盘是否带缓存是一个非常重要的指标,低端入门级的产品甚至有无缓存设计,无论是使用寿命还是性能表现都要差不少。而在当下高速产品由于数据交换量大,缓存已经是固态硬盘的标配,用来提高产品的读写性能。

    还有就是缓存算法问题。如果算法不优秀,命中率就不会高,这样大容量缓存形同虚设,甚至会出现掉速问题。另外,这还要结合硬盘本身的单碟容量、转速来决定。比方说传输持续读写速度在150MB/s左右、单碟不超过1TB容量的机械硬盘,缓存64MB就足够,128MB显然有些浪费;只有那些单碟容量超过1TB、持续读写性能在200MB/s左右的机械硬盘,128MB的缓存才有意义。

    在这里插入图片描述
    硬盘缓存越大越好吗

    大容量的缓存虽然可以在硬盘进行读写工作状态下,让更多的数据存储在缓存中,以提高硬盘的访问速度,但并不意味着缓存越大就越出众。缓存的应用存在一个算法的问题,即便缓存容量很大,而没有一个高效率的算法,那将导致应用中缓存数据的命中率偏低,无法有效发挥出大容量缓存的优势。算法是和缓存容量相辅相成,大容量的缓存需要更为有效率的算法,否则性能会大大折扣,从技术角度上说,高容量缓存的算法是直接影响到硬盘性能发挥的重要因素。

    大缓存不一定意味着高性能,当前很多采用128M以上大缓存规划的机械硬盘采用了SMR叠瓦磁记录技术,增大缓存容量是为了降低SMR带来的性能衰减幅度。
    在这里插入图片描述
    什么是硬盘缓冲区

    硬盘的缓冲区是硬盘与外部总线交换数据的场所。硬盘的读数据的过程是将此信号转化为电信号后,通过缓冲区一次次地填充与清空,再填充,再清空,一步步按照PCI总线的周期送出,可见,缓冲区的作用是相当重要的。它的作用也是提高性能,但是它与缓存的不同之处在于:一、它是容量固定的硬件,而不像缓存是可以由操作系统在内存中动态分配的。二、它对性能的影响大大超过硬盘缓存对性能的影响,因为如果没有缓冲区,就会要求每传一个字就需要读一次硬盘或写一次硬盘。

    根据以上解释我们可以知道:在其他参数系统的情况下硬盘缓存越大越好。现在主流的硬盘是SATA接口的,硬盘缓存的大小虽然是对硬盘有很大的影响,但是我们不要忽略了硬盘的转速。如果硬盘本身转数比较低,比如笔记本硬盘或者台式机的静音的硬盘转速一般都只有5400转左右,过大的缓存会占用内存使机器变慢,并不能提高硬盘性能。
    在这里插入图片描述
    总结

    虽然硬盘缓存大是能提高访问速度,但是我们也不得不考虑自己的电脑实际情况如何,是不是真的就适合过大的缓存。看来大家常常理解的硬盘缓存也大越好其实是一个明显的误区。朋友们,记得在下次调节硬盘缓存的时候,千万不要一昧的选择过大的缓存了,我们必须得闲了解自己的电脑性能,再根据其性能调节硬盘的缓存就一定错不了。

    转载自(https://cloud.tencent.com/developer/news/456804

    展开全文
  • redis缓存数据

    2018-09-01 18:14:10
    缓存数据的步骤 查询缓存,如果没有数据,则查询数据库 查询数据库,如果数据不为空,将结果写入缓存 缓存数据容易造成如下问题: 缓存穿透、缓存击穿、缓存失效 缓存穿透 什么叫缓存穿透? 一般的缓存系统,...

    缓存数据的步骤

    1. 查询缓存,如果没有数据,则查询数据库
    2. 查询数据库,如果数据不为空,将结果写入缓存

    缓存数据容易造成如下问题:

    缓存穿透、缓存击穿、缓存失效

    缓存穿透

    什么叫缓存穿透?

    一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

    如何解决?

    1、对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
    2、对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。(布隆表达式

     

    缓存雪崩(多个key)

    什么叫缓存雪崩?

    当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。

    如何解决?

    1、在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
    2、不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
    3、做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点未补充)

     

    缓存击穿(一个key)

    什么叫缓存击穿?

    对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。

    缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

    如何解决?

    使用redis的setnx互斥锁先进行判断,这样其他线程就处于等待状态,保证不会有大并发操作去操作数据库。

    if(redis.sexnx()==1){
        //查询数据库
        //加入线程
    }

    展开全文
  • 什么是缓存雪崩2.解决方案缓存击穿1.什么是缓存击穿2.解决方案3.缓存雪崩和缓存击穿的区别缓存穿透1.什么是缓存穿透2.解决方案3.布隆过滤器4.缓存击穿和缓存穿透的区别总结 缓存雪崩 1.什么是缓存雪崩 为了使查询...

    缓存雪崩

    1.什么是缓存雪崩

    为了使查询速度更快,我们选择使用缓存来保存数据,使原本每次请求都需要查询数据库的操作变成先查询缓存,缓存有直接返回,缓存没有则查询数据库然后再写入缓存中,通常缓存都是有有效时长的,否则就会一直占用内存空间。

    在这里插入图片描述

    当大量请求在访问都会先从缓存查询,如果此时大部分缓存同时过期失效,那么这些请求都查询不到缓存,此时他们会全部将请求到数据库,当请求数量足够大时此时将会把数据库压垮,这就是缓存雪崩。比如在凌晨十二点搞促销,大约有10000个用户发起请求,此时缓存过期,则这10000个请求直接打到数据库上,把数据库压垮,即使重启数据库请求依然会打到数据库上

    在这里插入图片描述

    2.解决方案

    • 不设置过期时间,缓存更新直接刷新
    • 过期时间上加随机值,避免缓存集中过期
    • 使用集群将数据均匀分布在机器上
    • 采取一定的限流降级机制,防止大量请求搞垮数据库

    缓存击穿

    1.什么是缓存击穿

    当redis缓存中有一个key是大量请求同时访问的热点数据,如果突然这个key时间到了,那么大量的请求在缓存中获取不到该key,穿过缓存直接来到数据库导致数据库崩溃,这样因为单个key失效而穿过缓存到数据库称为缓存击穿

    在这里插入图片描述

    2.解决方案

    • 最简单粗暴的解决方案就是让热点key不设置过期时间,即key一直存在于缓存中,更新时直接覆盖即可
    • 设置定时任务检测要过期的key,然后在将要过期的时候重新从数据库把数据刷新到缓存中,这样的方式增加系统复杂度,并且实现复杂
    • 使用互斥锁的方案,在缓存中没有数据去数据库查询时加上锁,让一个线程去查询数据库以及更新缓存,其他线程等待,这样减小数据库压力,代码如下。从代码中可以看出加互斥锁的方式比较复杂,并且使用递归的方式获取数据,极端情况下如果一直不能从缓存获取数据则会一直尝试获取锁
    public Object getData(String key) {
        ReentrantLock lock = new ReentrantLock();
        // 先从缓存取数据
        Object result = getDataFromCache(key);
        if (Objects.isNull(result)) {
            // 没取到数据则上锁从数据库查询,取到了直接返回
            if (lock.tryLock()) {
                // 争取到锁,从数据库查询数据
                Object dbData = getDataFromDataBase(key);
                if (Objects.nonNull(dbData)) {
                    // 如果数据库查询数据不为空刷新缓存然后返回
                    setCache(dbData);
                    return dbData;
                }
            } else {
                // 没争取到锁则等待一下,等待时间自己把握
                // 然后再次尝试调用获取方法,如果其他线程刷新缓存成功,在之后的调用中就会从缓存拿到数据
                // 如果其他线程也没有刷新缓存,则在递归调用中继续争取锁
                try {
                    TimeUnit.MILLISECONDS.sleep(1000);
                    result = getData(key);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }
    

    这里依然会存在一些问题,比如等待时间长短不容易把握,其次在等待过后继续递归调用方法争取锁,若长时间没有争取到锁,递归的层次就会越来越深,性能会大幅度下降,甚至造成SOFE。通常情况下解决缓存击穿直接让key缓存不过期就行了,毕竟并发量也达不到那么高

    3.缓存雪崩和缓存击穿的区别

    缓存雪崩和缓存击穿看起来是一回事,都是key过期导致的,其实缓存雪崩是大范围的key过期导致大量请求直接到数据库,缓存击穿是单个热点key失效导致大量请求到数据库。

    缓存穿透

    1.什么是缓存穿透

    指当请求查询缓存和数据库都不存在的数据时,先查询缓存为空,再查询数据库依然为空,向请求返回空,如果大量请求同时访问这些不存在key那么这些请求依然会造成压垮数据库的现象,这种通常是恶意查询和被攻击几率较大

    在这里插入图片描述

    2.解决方案

    • 缓存中存放查询的key,值设置为空,这样就能避免请求打到数据库,但是这样就会占用缓存空间
    • 在请求接口处做检查,如用户鉴权、参数校验等,对于不合法的请求直接返回,这样能够拦截部分不合法的请求
    • 使用布隆过滤器,那么什么是布隆过滤器呢?

    3.布隆过滤器

    布隆过滤器(Bloom Filter),其实就是一个值只有0和1的bit数组,对待过滤的数值求hash散列后可以查看这个数组中对应的位置上是否为1来进行判断过滤,常应用于网页黑名单系统、垃圾邮件过滤系统、爬虫网址判重系统等。布隆过滤器具有以下特点:

    • 数组占用空间小,通常一个容量为1亿的bit数组占用空间为11.92MB左右
    • 通过hash定位数组速度快,可在O(1)时间内返回结果
    • 不能够删除并且存在一定的误差

    产生误差是由于在计算hash定位时可能会出现hash冲突,也就是说值通过hash计算定位在一个值为1的位置,但是该值并不需要过滤因此会产生一定误差,解决办法有两种

    • 选用多个hash函数进行散列映射,当多个函数定位到的位置上全部为1时过滤该值,否则不过滤,这样准确率将会上升但并不能百分之百解决
    • 如果能提前知道总共数量则可以将bit数组大小设为总共数量大小,这样能够保证每个位置只能有一次命中,相对来说更占空间一点,但是由于bit数组本身占空间较小,即使100亿长度的数组也只占用1G左右空间
      在这里插入图片描述
      在这里插入图片描述
      可以通过使用布隆过滤器来对缓存穿透问题进行解决,当访问不存在的key时,将该key散列到bit数组中,且对应位置的值置1,下一次再访问该值时先在bit数组上查找,发现映射位置上为1,直接返回空,不需要再进行redis和数据库的查询

    4.缓存击穿和缓存穿透的区别

    • 缓存击穿是在单个key上的存在大量访问时,key失效导致大量访问直接到数据库上,就好像在缓存上开了一个洞,请求全部从这个洞中穿过来到数据库
    • 缓存穿透是指不停的访问缓存中不存在的值导致请求不停的请求数据库中不存在的数据,同样增加数据库压力,这样的方式相当于刻意绕过(穿过)缓存这部分来到数据库

    在这里插入图片描述

    总结

    缓存雪崩、缓存击穿、缓存穿透是生产和面试中常见的问题,在请求量小的时候这些问题造成的影响不大,但是一旦访问量大起来这些问题将会造成服务器宕机,甚至在重启服务器之后依然会扛不住压力继续宕机,只有提前为数据做好分析准备,选用合适方案进行解决才能够尽可能的减小生产服务器损失。

    展开全文
  • 对于浏览器缓存,相信很多...什么是浏览器缓存: 简单来说,浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中。缓存会根据进来的请求保存输出内容的副本。当下...
  • 什么是缓存?所谓的缓存就是,将程序频繁调用的对象,存在服务器系统内存中。以便下次调用时可以直接取系统内存中对象做到快速响应。省去了第一次访问时,对象实例创建和查询数据库等操作。从而,降低服务器资源...
  • 怎么用redis实现分页缓存,比如有1000页数据,只缓存当前页的后两页,点击到其他页时再缓存当前页的后两页。
  • 什么是Redis缓存穿透、缓存击穿、缓存雪崩?缓存穿透什么是缓存穿透?如何解决缓存穿透?缓存空值BloomFilter布隆过滤器缓存击穿什么是缓存击穿如何解决缓存击穿异步定时更新互斥锁缓存雪崩什么是缓存雪崩?如何避免...
  • 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。 解决办法: 1.布隆过滤 对所有...
  • 什么是缓存雪崩,缓存穿透,缓存预热,缓存更新,缓存降级?一、缓存雪崩:二、缓存穿透三、缓存预热四、缓存更新五、缓存降级 一、缓存雪崩: 由于原有缓存失效,新缓存未到期间(例如我们设置缓存采用了一样的过期...
  • 缓存穿透、缓存击穿、缓存雪崩区别和解决方案

    万次阅读 多人点赞 2018-09-19 14:35:57
    一、缓存处理流程  前台请求,后台先从缓存中取数据... 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导...
  • 缓存

    2018-07-18 16:53:01
    缓存的本质是让数据更接近使用者,如何设计缓存、哪些数据适合进行缓存缓存的方式、缓存的回收策略都是我们需要考量的点。 java应用缓存 http缓存 redis缓存 数据库缓存 mybatis缓存 nginx缓存 ...
  • Ehcache缓存和Redis缓存数据

    千次阅读 2020-07-19 11:46:11
    SpringBoot中使用JVM缓存 pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> ehcache.xml &...
  • 页面缓存数据缓存

    千次阅读 2018-01-25 22:57:05
    redis的全称为remote dictionary server,即远程数据服务,缓存数据库是由意大利人开发的一款内存高速,是用C语言编写的,数据模型为key-value,它支持丰富的数据类型,比如string,list,hash,set,sorted set,它...
  • CDN缓存什么?

    千次阅读 2016-11-16 17:57:18
    CDN是什么?  关于CDN是什么,此前网友详细介绍过。  CDN是Content Delivery Network的简称,即“内容分发网络”的意思。一般我们所说的CDN加速,一般是指网站加速或者用户下载资源加速。  可能这种专业...
  • Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,...
  • 但是Server Process 并不会直接从数据文件中读写数据, 而是把数据先放入SGA里面的Database buffer cache(数据库高速缓存)里再进行操作, 最终依靠后台进程DBWR 将缓存里修改后的数据写回数据文件.如图:...
  • 带上你的问题来学redis:什么是redis?redis缓存穿透?redis缓存雪崩?redis缓存击穿?如何处理? 还有:redis与数据库之间的数据一致性问题!
  • 什么时候使用Redis缓存

    万次阅读 2020-07-29 23:04:58
    Redis与其他key-value缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅支持简单的key-value类型的数据,同时还提供list,set,zset...
  • Android中网络请求数据以及其他数据本地缓存在很多开发的过程中我们需要联网进行数据请求,有时候一部分数据很长时间都是固定不变的这时候我们就想把这些数据进行本地缓存.之前一看见过很多的框架里面写着网络数据...
  • 缓存数据预热详解

    千次阅读 2017-11-27 22:52:50
    缓存预热
  • 什么情况算是缓存穿透? 个人理解,使用缓存就是为了减小数据库压力,让大部分的读请求都能落到缓存系统上。而只要请求穿过了缓存层,直接打到了数据库,我就把这个现象理解为缓存穿透。 什么情况会引起缓存穿透?...
  • 缓存-为什么需要使用分布式缓存

    万次阅读 2016-08-27 15:45:23
    什么需要使用分布式缓存数据网格)呢? 本文旨在回到这个问题. 首先, 它是进化的产物. 本地缓存 > 集群缓存 > 分布式缓存(数据网格) 使用分布式缓存的原因中包括了为什么使用缓存集群, 而使用缓存集群的原因中...
  • 什么要用缓存缓存使用不当会造成什么后果? 分析 这个问题,互联网公司必问,要是一个人连缓存都不太清楚,那确实比较尴尬。 只要问到缓存,上来第一个问题,肯定是先问问你项目哪里用了缓存?为啥要用?不用...
  • 什么是数据缓存中是否可能产生脏数据,如果出现脏数据该怎么处理?】 大家好,我是IT修真院上海分院第10期的学员许东杰,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java(职业...
  • 场景和问题等同于缓存查询,相关solution参考“缓存数据查询的注意事项”; 缓存未过期,数据库数据有变动主动更新至缓存; 比较常见的场景; 也即为双写的概念:有新版本的数据需要同时写入持久化层和缓存层中;...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,013,412
精华内容 405,364
关键字:

其它缓存数据是什么