缓存 订阅
缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。 展开全文
缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。
信息
外文名
cache
类    别
高速缓存、磁盘缓存
原    理
程序局部性原理
中文名
缓存
学    科
计算机
目    的
提高数据存取速度
缓存简介
缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。L1 Cache(一级缓存)是CPU第一层高速缓存。内置的L1高速缓存的容量和结构对CPU的性能影响较大,不过高速缓冲存储器均由静态RAM组成,结构较复杂,在CPU管芯面积不能太大的情况下,L1级高速缓存的容量不可能做得太大。一般L1缓存的容量通常在32—256KB。L2 Cache(二级缓存)是CPU的第二层高速缓存,分内部和外部两种芯片。内部的芯片二级缓存运行速率与主频相同,而外部的二级缓存则只有主频的一半。L2高速缓存容量也会影响CPU的性能,原则是越大越好,普通台式机CPU的L2缓存一般为128KB到2MB或者更高,笔记本、服务器和工作站上用CPU的L2高速缓存最高可达1MB-3MB。由于高速缓存的速度越高价格也越贵,故有的计算机系统中设置了两级或多级高速缓存。紧靠内存的一级高速缓存的速度最高,而容量最小,二级高速缓存的容量稍大,速度也稍低 [1]  。缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据,这样系统的速率就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。随着时间的变化,被访问得最频繁的数据不是一成不变的,也就是说,刚才还不频繁的数据,此时已经需要被频繁的访问,刚才还是最频繁的数据,又不频繁了,所以说缓存中的数据要经常按照一定的算法来更换,这样才能保证缓存中的数据是被访问最频繁的。
收起全文
精华内容
参与话题
问答
  • 缓存

    千次阅读 2020-02-26 11:39:45
    服务器缓存 优先去缓存中查找数据 数据不存在,再去数据库中查找 django 内置缓存系统 (参考博客) 提供缓存api 少的代码实现缓存 多种缓存 扩展性 setting中配置 set/get/delete 支持过期 常见问题 缓存雪崩 ...
    • 服务器优化,减少磁盘IO
    • 服务器缓存
      • 优先去缓存中查找数据
      • 数据不存在,再去数据库中查找
    • django 内置缓存系统 (参考博客
      • 提供缓存api
      • 少的代码实现缓存
      • 多种缓存
      • 扩展性
      • setting中配置
      • set/get/delete
      • 支持过期
      • 常见问题
        • 缓存雪崩 -> 缓存时间错开、多台设备缓存
        • 穿透 -> 缓存过期,同时来了多个用户访问此数据(导致此条数据被同时查询多遍)
          • 添加标记,已经有人在查询,其他人等待
        • 缓存时间 结合具体的业务场景
          • 新闻
          • 电影
    展开全文
  • 缓存穿透 (不经过缓存例如不存在的数据,直接查数据库 称作穿透) 高并发查询一个没有缓存的数据(一种是数据库中不存在,另一种是数据库有但缓存没有),这样所有的请求都会去访问数据库查询数据。这样数据库就会...

    缓存穿透 (不经过缓存例如不存在的数据,直接查数据库 称作穿透)

    高并发查询一个没有缓存的数据(一种是数据库中不存在,另一种是数据库有但缓存没有),这样所有的请求都会去访问数据库查询数据。这样数据库就会导致突然的高并发。

    解决方案:

    对于不存在的数据也进行缓存


    缓存雪崩(缓存数据大面积同时失效,高并发请求全部直接查询数据库 称为雪崩)

    采用相同的过期时间,导致数据同时失效,请求全部转发到数据库,数据库瞬间压力过大。

    解决方案:

    对于缓存的过期时间采用随机值


    缓存击穿(热点数据失效,那一时刻,高并发请求会直接请求数据库查询)

    热点数据(某一个数据突然过期)失效,突然的高并发请求查询,结果缓存过期了,导致请求直接去查数据库。

    解决方案:

    对数据库查询操作加锁
    第一个请求,拿到锁后其它请求等一等,然后这个请求获得到数据后将结果做缓存。然后释放锁
    第二个请求,拿到锁后,先查缓存有没有,有则从缓存拿,如果没有重复第一个请求的过程。

    高并发加锁的逻辑

    在这里插入图片描述

    Redis分布式锁需要进行原子加锁和原子删锁

    在这里插入图片描述
    上图敲错了,是lua
    在这里插入图片描述

    展开全文
  • (精华)2020年8月18日 缓存机制

    万次阅读 2020-08-18 08:08:34
    缓存 1. 缓存理解 缓存定义: 浏览器在本地磁盘上将用户之前请求的数据存储起来,当访问者再次需要改数据的时候无需再次发送请求,直接从浏览器本地获取数据 缓存的好处: 减少请求的个数 节省带宽,避免浪费不必要的...

    缓存

    1. 缓存理解

    1. 缓存定义:
    2. 浏览器在本地磁盘上将用户之前请求的数据存储起来,当访问者再次需要改数据的时候无需再次发送请求,直接从浏览器本地获取数据
    3. 缓存的好处:
    4. 减少请求的个数
    5. 节省带宽,避免浪费不必要的网络资源
    6. 减轻服务器压力
    7. 提高浏览器网页的加载速度,提高用户体验

    2. 缓存分类

    1. 强缓存

    2. 不会向服务器发送请求,直接从本地缓存中获取数据

    3. 请求资源的的状态码为: 200 ok(from memory cache)

    4. 协商缓存

    5. 向服务器发送请求,服务器会根据请求头的资源判断是否命中协商缓存

    6. 如果命中,则返回304状态码通知浏览器从缓存中读取资源

    7. 强缓存 & 协商缓存的共同点

    8. 都是从浏览器端读取资源

    9. 强缓存 VS 协商缓存的不同点

      1. 强缓存不发请求给服务器
      2. 协商缓存发请求给服务器,根据服务器返回的信息决定是否使用缓存

    3. 缓存使用示意图

    4. 缓存中的header参数

    1、浏览器默认缓存时间

    Chrome和Firefox对js、css之类的文件,在内存中的缓存时长,是:
      (访问时间 - 该文件的最后修改时间) ÷ 10
      例子:
      假设 7点0分 访问的 5点0分修改的 index.html ,
      那么缓存时间为
      26060 ÷ 10 = 720 秒
      页面缓存时间为 720 秒

    1、强缓存的header参数


    1. expires:
    2. 这是http1.0时的规范;它的值为一个绝对时间的GMT格式的时间字符串,如Mon, 10 Jun 2015 21:31:12 GMT,如果发送请求的时间在expires之前,那么本地缓存始终有效,否则就会发送请求到服务器来获取资源
    3. cache-control:max-age=number
    4. 这是http1.1时出现的header信息,主要是利用该字段的max-age值来进行判断,它是一个相对值;资源第一次的请求时间和Cache-Control设定的有效期,计算出一个资源过期时间,再拿这个过期时间跟当前的请求时间比较,如果请求时间在过期时间之前,就能命中缓存,否则就不行;
    5. cache-control常用的值(做一个简单了解即可):
    6. no-cache: 不使用本地缓存,需要使用协商缓存。先与服务器确认返回的响应是否被更改,如果之前的响应中存在Etag,那么请求的额时候会与服务器端进行验证,如果资源为被更改则使用缓存。
    7. no-store: 直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
    8. public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
    9. private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
    10. 注意:当cache-control与Expires共存的时候cache-control的优先级高

    from memory cache与from disk cache详解
    https://blog.csdn.net/garrettzxd/article/details/80684880

    他们是配合http缓存的。 memory cache命中最快,但是它周期较短,base64的图片,较小的js和css能够有较大几率被写进内存,这没有确定的定论。 其他较大的js、css和图片等会被直接写进硬盘,进行缓存。

    存储在磁盘空间的文件通过在浏览器输入 chrome://version/

    2、协商缓存的header参数


    重点:协商缓存都是由服务器来确定缓存资源是否可用的,所以客户端与服务器端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问

    Last-Modified : 服务端生成后给客户端的
    If-Modified-Since:客户端给服务端的, 只是变了一个名字

    • Last-Modified/If-Modified-Since:二者的值都是GMT格式的时间字符串
    1. 浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Last-Modified的header,这个header表示这个资源在服务器上的最后修改时间
    2. 浏览器再次跟服务器请求这个资源时,在request的header上加上If-Modified-Since的header,这个header的值就是上一次请求时返回的Last-Modified的值
    3. 服务器再次收到资源请求时,根据浏览器传过来If-Modified-Since和资源在服务器上的最后修改时间判断资源是否有变化,如果没有变化则返回304 Not Modified,但是不会返回资源内容;如果有变化,就正常返回资源内容。当服务器返回304 Not Modified的响应时,response header中不会再添加Last-Modified的header,因为既然资源没有变化,那么Last-Modified也就不会改变,这是服务器返回304时的response header
    4. 浏览器收到304的响应后,就会从缓存中加载资源
    5. 如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified的Header在重新加载的时候会被更新,下次请求时,If-Modified-Since会启用上次返回的Last-Modified值

    Etag : 服务端生成后给客户端的
    If-None-Match : 客户端给服务端的, 只是变了一个名字

    • Etag/If-None-Match
      1. 这两个值是由服务器生成的每个资源的唯一标识字符串,只要资源有变化就这个值就会改变
      2. 其判断过程与Last-Modified/If-Modified-Since类似

    • 既生Last-Modified何生Etag
      1. HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题
      2. 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET
      3. 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);
      4. 某些服务器不能精确的得到文件的最后修改时间。

    • 小结:
      • 利用Etag能够更加准确的控制缓存,因为Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符。

      • Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

    5. 强缓存如何重新加载新的资源

    • 通过更新页面中引用的资源路径,让浏览器主动放弃加载缓存去加载新的资源
    • 示例:https://www.baidu.com/s?t=7aec0h3KB3Ba8lAbuyPg0AC0eDa59IvtDSmtMQBc6eW
    • 好处:
      • 每次文件改变后query的值就会发生修改,当query值不同的时候也就是页面引用的资源路径不同。此时浏览器会主动加载新的资源。

    缓存示意图

    在这里插入图片描述

    展开全文
  • 页面缓存后,页面是不会变化的。要使缓存页面变化可以利用路由的钩子函数beforeRouteLeave。 <template> <div </div> </template> <script> export default { methods: { }, ...

    页面缓存后,页面是不会变化的。要使缓存页面变化可以利用路由的钩子函数beforeRouteLeave。

    <template>
      <div
      </div>
    </template>
    <script>
    export default {
      methods: {
      },
      beforeRouteLeave(to, from, next) {
        // 导航离开该组件的对应路由时调用
        // 可以访问组件实例 `this`
        console.log(to);
        if (to.name !== "myQuestionDetail") {
          this.getQuestionList();
        }
        next();
      },
      mounted() {
        this.getQuestionList();
      }
    };
    </script>
    
    
    展开全文
  • VUE 缓存 设置缓存 使用缓存

    万次阅读 2019-08-06 18:58:38
    VUE.JS 使用缓存我建议用good-storage ,简单方便好用,下面来看看怎么使用它 good-storage 是一个插件,需要安装 localStorage 临时缓存(主动清除缓存才会销毁) sessionStorage 长期缓存(关闭浏览器自动销毁...
  • springboot中的缓存注解支持Spel表达式,因此这里展示常用的SpEL表达式 SpEL运算符 类型 运算符 关系运算符 < ,> , <= ,>=,==,!=,lt,gt,le,ge,eq,ne 算数运算符 +,-,*,/ ,%,^ ...
  • 缓存穿透、缓存击穿、缓存雪崩区别和解决方案

    万次阅读 多人点赞 2018-09-19 14:35:57
    一、缓存处理流程  前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。     二、缓存穿透  描述:  缓存...
  • 静态字段缓存基本使用 /// <summary> /// 1 客户端缓存-CDN缓存-反向代理缓存-本地缓存 /// 2 本地缓存原理和手写基础实现 /// 3 缓存更新/过期/多线程测试 /// 4 缓存类库封装和缓存应用总结 /// <...
  • 清除微信内置浏览器缓存

    万次阅读 2018-08-22 21:19:44
    在做微信开发的时候(主要是微信内网页或者比较大型的手机网站)的时候,更改了页面代码,但是微信内置浏览器有缓存,还是之前的效果,影响调试,而且还死活清除不掉!!!!!怎么办? 我的第一想法是关闭手机的...
  • Redis缓存穿透、缓存雪崩问题分析

    万次阅读 多人点赞 2018-06-01 22:16:35
    把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数据量很大的时候,经典的几个问题如下: (一)缓存和数据库间数据一致性问题 分布式环境下(单机就不用说了)非常容易出现...
  • 浅谈 MyBatis 三级缓存

    万次阅读 2020-03-15 21:38:10
    1、一级缓存 ​ MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的。即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,...
  • vue中缓存路由组件

    万次阅读 2020-06-14 19:25:37
    通过keep-alive的缓存路由组件,切换路由时原来的路由组件中的数据也会和数据一起保存下来。 这样就能做到切换路由,不用重新从后台获取数据,直接使用刚刚缓存的数据 <keep-alive> <router-view></...
  • 》,今天给大家整理一篇关于Redis经常被问到的问题:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等概念的入门及简单解决方案。 一、缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未...
  • 我没想到他会这么问
  • 1查询缓存 1.1什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。 mybaits提供一级缓存,和二级缓存。 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中...
  • Mybatis07_缓存

    万次阅读 2020-10-04 18:09:51
    Mybatis07_缓存 一级缓存:sqlSession级别,默认开启,不能关闭。 在同一sqlSession范围内,执行两次相同的sql查询语句时,第一次执行的结果会保存至缓存,第二次查询将直接从缓存中获取。 当sqlSession执行了...
  • Caffeine 缓存

    万次阅读 2017-12-13 17:07:05
    缓存和 Map 之间的一个根本区别在于缓存可以回收存储的 item。 回收策略为在指定时间删除哪些对象。此策略直接影响缓存的命中率 — 缓存库的一个重要特征。 Caffeine 因使用 Window TinyLfu 回收策略,提供了一个...
  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析

    万次阅读 多人点赞 2017-01-06 11:12:50
    设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则...
  • Redis应用之缓存实现

    万次阅读 2019-03-17 11:47:10
    文章目录Redis缓存1.缓存概述2.缓存方式不设置过期时间设置过期时间3.总结   Redis的众多应用场景中缓存绝对是频率最高的场景了。本文来介绍下Redis作为缓存要注意的地方。 Redis缓存 1.缓存概述   缓存...
  • Android DiskLruCache完全解析,硬盘缓存的最佳方案

    万次阅读 多人点赞 2014-08-07 09:13:00
    记得在很早之前,我有写过一篇文章Android高效加载大图、多图解决方案,...对此,Google又提供了一套硬盘缓存的解决方案,DiskLruCache(非Google官方编写,但获得官方认证)。只可惜,Android Doc中并没有对DiskLruCache
  • mac chrome 强制刷新浏览器缓存

    万次阅读 2017-05-01 10:04:21
    普通刷新:command +r 强制刷新:command+shift+r
  • 缓存穿透,缓存击穿,缓存雪崩

    千次阅读 2019-02-28 13:33:45
    文章目录缓存穿透,缓存击穿,缓存雪崩1、什么是缓存穿透2、如何解决缓存穿透方案一方案二3、什么是缓存击穿4、缓存击穿与缓存雪崩的区别5、如何解决缓存击穿方案一方案二方案三方案四6、什么是缓存雪崩7、如何避免...
  • 详解:mybatis的缓存机制(一级缓存二级缓存和刷新缓存
  • Hibernate的一级缓存的目的是为了方便管理实体类的状态(临时状态、持久化状态、游离状态、删除状态)。Hibernate的目的二级缓存是为了减少sql语句。那么mybatis的一级缓存和二级缓存的目的是为了什么? Hibernate的...
  • Redis 缓存 + Spring 的集成示例

    万次阅读 多人点赞 2015-09-24 19:53:26
    《整合 spring 4(包括mvc、context、orm) + ...现在我们需要把缓存也整合进来,缓存我们选用的是 Redis,本文将在该文示例基础上介绍 Redis 缓存 + Spring 的集成。关于 Redis 服务器的搭建请参考博客《Redhat5.8 环
  • 深入了解MyBatis二级缓存

    万次阅读 多人点赞 2015-03-30 08:57:42
    MyBatis深入了解二级缓存
  • 缓存随意,假如我存放了一个list至缓存,list中有两个obj1,obj2对象。 我对obj1对象进行修改,删除obj2对象。 按照正常业务,缓存中的这个list也应该进行更新,但是我如何根据我的修改或者删除操作知道那个list中有...

空空如也

1 2 3 4 5 ... 20
收藏数 360,681
精华内容 144,272
关键字:

缓存