浏览器缓存

2023-05-16

阅读目录

  1. 浏览器缓存基本认识
  2. 强缓存的原理
  3. 强缓存的管理
  4. 强缓存的应用
  5. 协商缓存的原理
  6. 协商缓存的管理
  7. 浏览器行为对缓存的影响

  浏览器缓存,也就是客户端缓存,既是网页性能优化里面静态资源相关优化的一大利器,也是无数web开发人员在工作过程不可避免的一大问题,所以在产品开发的时候我们总是想办法避免缓存产生,而在产品发布之时又在想策略管理缓存提升网页的访问速度。了解浏览器的缓存命中原理,是开发web应用的基础,本文着眼于此,学习浏览器缓存的相关知识,总结缓存避免和缓存管理的方法,结合具体的场景说明缓存的相关问题。希望能对有需要的人有所帮助。

1. 浏览器缓存基本认识

它分为强缓存和协商缓存: 
  1)浏览器在加载资源时,先根据这个资源的一些http header判断它是否命中强缓存,强缓存如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务器。比如某个css文件,如果浏览器在加载它所在的网页时,这个css文件的缓存配置命中了强缓存,浏览器就直接从缓存中加载这个css,连请求都不会发送到网页所在服务器;

  2)当强缓存没有命中的时候,浏览器一定会发送一个请求到服务器,通过服务器端依据资源的另外一些http header验证这个资源是否命中协商缓存,如果协商缓存命中,服务器会将这个请求返回,但是不会返回这个资源的数据,而是告诉客户端可以直接从缓存中加载这个资源,于是浏览器就又会从自己的缓存中去加载这个资源;

  3)强缓存与协商缓存的共同点是:如果命中,都是从客户端缓存中加载资源,而不是从服务器加载资源数据;区别是:强缓存不发请求到服务器,协商缓存会发请求到服务器。

  4)当协商缓存也没有命中的时候,浏览器直接从服务器加载资源数据。

  mine:即是发生强缓存,返回的是200,没命中的话再发生协商缓存,返回304。都没有的话就直接请求数据资源了。

2. 强缓存的原理

  当浏览器对某个资源的请求命中了强缓存时,返回的http状态为200,在chrome的开发者工具的network里面size会显示为from cache,比如京东的首页里就有很多静态资源配置了强缓存,用chrome打开几次,再用f12查看network,可以看到有不少请求就是从缓存中加载的:

  强缓存是利用Expires或者Cache-Control这两个http response header实现的,它们都用来表示资源在客户端缓存的有效期。

  Expires是http1.0提出的一个表示资源过期时间的header,它描述的是一个绝对时间,由服务器返回,用GMT格式的字符串表示,如:Expires:Thu, 31 Dec 2037 23:55:55 GMT,它的缓存原理是:

  1)浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Expires的header,如:

  2)浏览器在接收到这个资源后,会把这个资源连同所有response header一起缓存下来(所以缓存命中的请求返回的header并不是来自服务器,而是来自之前缓存的header);

  3)浏览器再请求这个资源时,先从缓存中寻找,找到这个资源后,拿出它的Expires跟当前的请求时间比较,如果请求时间在Expires指定的时间之前,就能命中缓存,否则就不行。

  4)如果缓存没有命中,浏览器直接从服务器加载资源时,Expires Header在重新加载的时候会被更新。

  Expires是较老的强缓存管理header,由于它是服务器返回的一个绝对时间,在服务器时间与客户端时间相差较大时,缓存管理容易出现问题,比如随意修改下客户端时间,就能影响缓存命中的结果。所以在http1.1的时候,提出了一个新的header,就是Cache-Control,这是一个相对时间,在配置缓存的时候,以秒为单位,用数值表示,如:Cache-Control:max-age=315360000,它的缓存原理是:

  1)浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上Cache-Control的header,如:

  2)浏览器在接收到这个资源后,会把这个资源连同所有response header一起缓存下来;

  3)浏览器再请求这个资源时,先从缓存中寻找,找到这个资源后,根据它第一次的请求时间和Cache-Control设定的有效期,计算出一个资源过期时间,再拿这个过期时间跟当前的请求时间比较,如果请求时间在过期时间之前,就能命中缓存,否则就不行。

  4)如果缓存没有命中,浏览器直接从服务器加载资源时,Cache-Control Header在重新加载的时候会被更新。

  Cache-Control描述的是一个相对时间,在进行缓存命中的时候,都是利用客户端时间进行判断,所以相比较Expires,Cache-Control的缓存管理更有效,安全一些。

  这两个header可以只启用一个,也可以同时启用,当response header中,Expires和Cache-Control同时存在时,Cache-Control优先级高于Expires:

3. 强缓存的管理

  前面介绍的是强缓存的原理,在实际应用中我们会碰到需要强缓存的场景和不需要强缓存的场景,通常有2种方式来设置是否启用强缓存:

    1)通过代码的方式,在web服务器返回的响应中添加Expires和Cache-Control Header;

    2)通过配置web服务器的方式,让web服务器在响应资源的时候统一添加Expires和Cache-Control Header。

  比如在javaweb里面,我们可以使用类似下面的代码设置强缓存:


java.util.Date date = new java.util.Date();    
response.setDateHeader("Expires",date.getTime()+20000); //Expires:过时期限值 
response.setHeader("Cache-Control", "public"); //Cache-Control来控制页面的缓存与否,public:浏览器和缓存服务器都可以缓存页面信息;
response.setHeader("Pragma", "Pragma"); //Pragma:设置页面是否缓存,为Pragma则缓存,no-cache则不缓存  

  还可以通过类似下面的java代码设置不启用强缓存:


response.setHeader( "Pragma", "no-cache" );   
response.setDateHeader("Expires", 0);   
response.addHeader( "Cache-Control", "no-cache" );//浏览器和缓存服务器都不应该缓存页面信息  

  tomcat还提供了一个ExpiresFilter专门用来配置强缓存,具体使用的方式可参考tomcat的官方文档:http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#Expires_Filter

  nginx和apache作为专业的web服务器,都有专门的配置文件,可以配置expires和cache-control,这方面的知识,如果你对运维感兴趣的话,可以在百度上搜索“nginx 设置 expires cache-control”或“apache 设置 expires cache-control”都能找到不少相关的文章。

  由于在开发的时候不会专门去配置强缓存,而浏览器又默认会缓存图片,css和js等静态资源,所以开发环境下经常会因为强缓存导致资源没有及时更新而看不到最新的效果,解决这个问题的方法有很多,常用的有以下几种:

  1)直接ctrl+f5,这个办法能解决页面直接引用的资源更新的问题;

  2)使用浏览器的隐私模式开发;

  3)如果用的是chrome,可以f12在network那里把缓存给禁掉(这是个非常有效的方法):

  4)在开发阶段,给资源加上一个动态的参数,如css/index.css?v=0.0001,由于每次资源的修改都要更新引用的位置,同时修改参数的值,所以操作起来不是很方便,除非你是在动态页面比如jsp里开发就可以用服务器变量来解决(v=${sysRnd}),或者你能用一些前端的构建工具来处理这个参数修改的问题;

  5)如果资源引用的页面,被嵌入到了一个iframe里面,可以在iframe的区域右键单击重新加载该页面,以chrome为例:

  6)如果缓存问题出现在ajax请求中,最有效的解决办法就是ajax的请求地址追加随机数;

  7)还有一种情况就是动态设置iframe的src时,有可能也会因为缓存问题,导致看不到最新的效果,这时候在要设置的src后面添加随机数也能解决问题;

  8)如果你用的是grunt和gulp这种前端工具开发,通过它们的插件比如grunt-contrib-connect来启动一个静态服务器,则完全不用担心开发阶段的资源更新问题,因为在这个静态服务器下的所有资源返回的respone header中,cache-control始终被设置为不缓存:

4. 强缓存的应用

  强缓存是前端性能优化最有力的工具,没有之一,对于有大量静态资源的网页,一定要利用强缓存,提高响应速度。通常的做法是,为这些静态资源全部配置一个超时时间超长的Expires或Cache-Control,这样用户在访问网页时,只会在第一次加载时从服务器请求静态资源,其它时候只要缓存没有失效并且用户没有强制刷新的条件下都会从自己的缓存中加载,比如前面提到过的京东首页缓存的资源,它的缓存过期时间都设置到了2026年:

  然而这种缓存配置方式会带来一个新的问题,就是发布时资源更新的问题,比如某一张图片,在用户访问第一个版本的时候已经缓存到了用户的电脑上,当网站发布新版本,替换了这个图片时,已经访问过第一个版本的用户由于缓存的设置,导致在默认的情况下不会请求服务器最新的图片资源,除非他清掉或禁用缓存或者强制刷新,否则就看不到最新的图片效果。

  这个问题已经有成熟的解决方案,具体内容可阅读知乎这篇文章“大公司里怎样开发和部署前端代码?”详细了解:

  文章提到的东西都属于理论上的解决方案,不过现在已经有很多前端工具能够实际地解决这个问题,由于每个工具涉及到的内容细节都有很多,本文没有办法一一深入介绍。有兴趣的可以去了解下grunt gulp webpack fis 还有edp这几个工具,基于这几个工具都能解决这个问题,尤其是fis和edp是百度推出的前端开发平台,有现成的文档可以参考:

  FIS3的相关文档

  http://ecomfe.github.io/edp/doc/initialization/install/

  强缓存还有一点需要注意的是,通常都是针对静态资源使用,动态资源需要慎用,除了服务端页面可以看作动态资源外,那些引用静态资源的html也可以看作是动态资源,如果这种html也被缓存,当这些html更新之后,可能就没有机制能够通知浏览器这些html有更新,尤其是前后端分离的应用里,页面都是纯html页面,每个访问地址可能都是直接访问html页面,这些页面通常不加强缓存,以保证浏览器访问这些页面时始终请求服务器最新的资源。

5. 协商缓存的原理

  当浏览器对某个资源的请求没有命中强缓存,就会发一个请求到服务器,验证协商缓存是否命中,如果协商缓存命中,请求响应返回的http状态为304并且会显示一个Not Modified的字符串,比如你打开京东的首页,按f12打开开发者工具,再按f5刷新页面,查看network,可以看到有不少请求就是命中了协商缓存的:

  查看单个请求的Response Header,也能看到304的状态码和Not Modified的字符串,只要看到这个就可说明这个资源是命中了协商缓存,然后从客户端缓存中加载的,而不是服务器最新的资源:

  协商缓存是利用的是【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对Header来管理的。

  【Last-Modified,If-Modified-Since】的控制缓存的原理是:

  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:

image

  4)浏览器收到304的响应后,就会从缓存中加载资源。

  5)如果协商缓存没有命中,浏览器直接从服务器加载资源时,Last-Modified Header在重新加载的时候会被更新,下次请求时,If-Modified-Since会启用上次返回的Last-Modified值。

  【Last-Modified,If-Modified-Since】都是根据服务器时间返回的header,一般来说,在没有调整服务器时间和篡改客户端缓存的情况下,这两个header配合起来管理协商缓存是非常可靠的,但是有时候也会服务器上资源其实有变化,但是最后修改时间却没有变化的情况,而这种问题又很不容易被定位出来,而当这种情况出现的时候,就会影响协商缓存的可靠性。所以就有了另外一对header来管理协商缓存,这对header就是【ETag、If-None-Match】。它们的缓存管理的方式是:

  1)浏览器第一次跟服务器请求一个资源,服务器在返回这个资源的同时,在respone的header加上ETag的header,这个header是服务器根据当前请求的资源生成的一个唯一标识,这个唯一标识是一个字符串,只要资源有变化这个串就不同,跟最后修改时间没有关系,所以能很好的补充Last-Modified的问题:

image

  2)浏览器再次跟服务器请求这个资源时,在request的header上加上If-None-Match的header,这个header的值就是上一次请求时返回的ETag的值:

image

  3)服务器再次收到资源请求时,根据浏览器传过来If-None-Match和然后再根据资源生成一个新的ETag,如果这两个值相同就说明资源没有变化,否则就是有变化;如果没有变化则返回304 Not Modified,但是不会返回资源内容;如果有变化,就正常返回资源内容。与Last-Modified不一样的是,当服务器返回304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化:

image

  4)浏览器收到304的响应后,就会从缓存中加载资源。

6. 协商缓存的管理

  协商缓存跟强缓存不一样,强缓存不发请求到服务器,所以有时候资源更新了浏览器还不知道,但是协商缓存会发请求到服务器,所以资源是否更新,服务器肯定知道。大部分web服务器都默认开启协商缓存,而且是同时启用【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】,比如apache:

image

  如果没有协商缓存,每个到服务器的请求,就都得返回资源内容,这样服务器的性能会极差。

  【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】一般都是同时启用,这是为了处理Last-Modified不可靠的情况。有一种场景需要注意:

  分布式系统里多台机器间文件的Last-Modified必须保持一致,以免负载均衡到不同机器导致比对失败;

  分布式系统尽量关闭掉ETag(每台机器生成的ETag都会不一样);

  京东页面的资源请求,返回的repsones header就只有Last-Modified,没有ETag:

image

  协商缓存需要配合强缓存使用,你看前面这个截图中,除了Last-Modified这个header,还有强缓存的相关header,因为如果不启用强缓存的话,协商缓存根本没有意义。

7. 浏览器行为对缓存的影响

  如果资源已经被浏览器缓存下来,在缓存失效之前,再次请求时,默认会先检查是否命中强缓存,如果强缓存命中则直接读取缓存,如果强缓存没有命中则发请求到服务器检查是否命中协商缓存,如果协商缓存命中,则告诉浏览器还是可以从缓存读取,否则才从服务器返回最新的资源。这是默认的处理方式,这个方式可能被浏览器的行为改变:

  1)当ctrl+f5强制刷新网页时,直接从服务器加载,跳过强缓存和协商缓存;

  2)当f5刷新网页时,跳过强缓存,但是会检查协商缓存;


来自:http://www.cnblogs.com/Chen-XiaoJun/p/6196470.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器缓存 的相关文章

  • 从io模型到ppc,tpc,reactor,preactor

    所有的系统I O都分为两个阶段 xff1a 等待就绪和操作 读就是等待系统可读和真正的读 写就是等待系统可写和真正的写 1 网络io模型 这是我们常见的一张图 1 传统的bio 就是同步阻塞的 当调用socket read的时候 会阻塞 直
  • ip校验和 及 udp校验和 的计算方法

    一 ip校验和的计算 计算方法 1 ip包头 共20个字节 按照每16个bit作为一个值依次进行相加 2 将计算结果的进位加到低16位上 3 将结果取反 ip包头的内存内容 eg 45 00 00 20 0F B8 00 00 80 11
  • 轻量化固态激光雷达的三维定位与建图

    点云PCL免费知识星球 xff0c 点云论文速读 文章 xff1a Lightweight 3 D Localization and Mapping for Solid State LiDAR 作者 xff1a Han Wang Chen
  • 嵌入式Linux下CAN接口socket发送调试

    1 简介 最近在做嵌入式linux can通讯的调试 xff0c 需要用到扩展帧 xff0c 参照示例代码和linux库改为扩展帧格式发送 参考链接 链接 https blog csdn net toradexsh article deta
  • 矩阵转置与矩阵相乘

    1 转置矩阵 1 1转置矩阵简介 把矩阵A的行换成同序数的列得到的新矩阵 xff0c 叫做A的转置矩阵 Transpose of a Matrix xff0c 记作ATAT 例如 xff1a 因此 xff0c 转置矩阵的特点 xff1a x
  • Python+Opencv:解决打开摄像头慢的问题,现在秒开视频

    前言 打开摄像头非常慢 大概需要5 11秒才能输出视频 这个问题困扰了我很久 一直没得到解决 今天终于得到解决 实现了秒开 值得记录和庆贺一下 我的开发环境 不同的开发环境可能不会遇到我这样的问题 1 操作系统是windows10 64位
  • WAP网页游戏

    最近利用空余时间开发了一款类似3GQQ家园的网页游戏 使用apache 43 mysql 43 php 游戏地址 xff1a www cmdandxgz top bug可能很多 xff0c 正在测试 游戏页面如下
  • WPS里公式居中、编号右对齐

    WPS里 xff0c 我目前没找到公式自动编号的方式 xff0c 在此提供一种还算编辑的手动编号并右对齐的方式 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 6
  • 【计算机视觉基础】8.内部参数描述

    目录 1 Film Coords gt Pixel Coords 2 变换 2 1 平移 2 2 尺度变换 2 3 旋转 2 4 刚体运动 2 5 刚体 43 尺度变换 2 6 仿射变换 2 7 投影变换 3 2D变换总结如下图 1 Fil
  • 【计算机视觉基础】5.投影变换扩展(单应性Homograph估计)

    1 投影变换 投影变换分为平行投影 xff08 正交投影 xff09 和中心投影 xff08 透视投影 xff09 xff0c 投影变换是联系三维空间物体与二维图形的桥梁 基础的变换参考之前的博客 计算机视觉基础 3 矩阵变换图形 xff0
  • 人类3D的感觉是什么

    目录 一 人是如何 看 到3d物体的 1 xff0c 眼睛的对焦距离 2 xff0c 两只眼睛同时观看物体的差别 3 xff0c 眼睛在移动中观测物体的差别 4 xff0c 特定物体的大小 5 xff0c 物体的几何形变 6 xff0c 光
  • ubuntu命令行访问网页

    sudo apt get install w3m w3m www baidu com使用命令行访问网页 xff0c 但效果不是很好
  • Linux下使用matlab运行.m文件

    在Linux下安装完matlab后 xff0c 会在 usr local bin 下生成matlab文件 xff0c 可以使用matlab命令 Usage matlab h help n e arch v 61 variant v 61 a
  • numpy数组与list之间的转换

    a 61 3 234 34 3 777 6 33 a为python的list类型 将a转化为numpy的array np array a array 3 234 34 3 777 6 33 将a转化为python的list a tolist
  • SSD深度解析:MLC颗粒和TLC颗粒到底有多大差别?

    计算机技术发展到今天 xff0c CPU和内存性能早已不是性能瓶颈 xff0c 但是硬盘依然是电脑常见瓶颈 xff01 固态硬盘的出现极大的改善机械硬盘的存储效率 xff0c 但是因为固态硬盘还处于行业发展初期 xff0c 所以成本很高 x
  • 泰勒(Taylor)展开式(泰勒级数)

    目录 泰勒公式 余项 1 佩亚诺 Peano xff09 余项 xff1a 2 施勒米尔希 罗什 Schlomilch Roche xff09 余项 xff1a 3 拉格朗日 xff08 Lagrange xff09 余项 xff1a 4
  • 【计算机视觉基础】4.仿射变换

    主要看这个哦 xff1a 马同学 xff1a 如何通俗地讲解 仿射变换 这个概念 xff1f 知乎 简单来说 xff0c 仿射变换 就是 xff1a 线性变换 43 平移 目录 1 线性变换 1 1 旋转 1 2 推移 xff08 图像学中

随机推荐

  • Selenium+Python自动化脚本环境搭建

    本文仅介绍环境的搭建 xff0c 不包含任何脚本编写教程 先整体说一下需要用到工具 1 Python环境 xff08 包括pip xff09 2 谷歌浏览器 xff08 包括对应的WebDriver xff09 详细步骤 xff1a 一 P
  • CUDA之nvidia-smi命令详解

    nvidia smi是用来查看GPU使用情况的 我常用这个命令判断哪几块GPU空闲 xff0c 但是最近的GPU使用状态让我很困惑 xff0c 于是把nvidia smi命令显示的GPU使用表中各个内容的具体含义解释一下 这是服务器上特斯拉
  • CMakeLists之引入头文件(五)

    1 新建项目 新建项目t4 目录结构如下 xff1a 该程序引入了自建的hello h程序库包含了函数func main c的内容如下所示 xff1a main c include lt hello h gt int main func r
  • 用HttpPost登陆验证时,用户名和密码放在请求头部header中的处理方法,形式为Authorization: username password。

    xfeff xfeff post setHeader 34 Authorization 34 34 your token 34 这里主要是要搞清楚your token是什么 xff0c 把认证信息传递正确 xff0c 这个认证信息是通过用户
  • vs code 运行C语言并调试

    vs code 运行C语言 2022 03 19 mingw64下载地址更新 xff08 window xff09 task json文件修改launch json文件修改 更新版 xff08 window xff09 1 下载MinGW编
  • 【Http认证方式】——Basic认证

    今天在访问请求 xff1a http 192 168 2 113 8080 geoserver rest workspaces时 xff0c 浏览器弹出窗口需要输入用户名和密码 xff0c 并且 xff0c 如果不输入或者输入错误 xff0
  • 大小端介绍与分析

    1 字节序 字节序即字节的存储顺序 xff0c 如果数据都是单字节的 xff0c 那怎么存储无所谓了 xff0c 但是对于多字节数据 xff0c 比如int xff0c double等 xff0c 就要考虑存储的顺序了 字节序是硬件层面的东
  • Emgu-WPF 激光雷达研究-定位实现

    特定位置或障碍物位置定位实现 读取激光雷达数据并存储于本地作为测试数据 每一帧数据对同一障碍物的定位信息均存在偏差 所以先对需要定位的点进行数据取样 取样过程中 xff0c 遇到数据丢失 xff0c 或检测到多个障碍物 不满足障碍物生存指数
  • Jetson NX性能介绍

    NX的各个工作模式及功耗 xff1a 与其他jetson系列板卡的对比
  • 移远EC200UCN_LA 4G通信模块 OpenCPU二次开发过程中遇到的各种坑

    这里主要记录一下我在使用移远开发板进行 EC200UCN LA 4G通信模块开发中遇到的各种坑 注 xff1a Q为遇到的问题 A为问题的解决办法 T为注意事项 Q 串口demo无法正常接收和发送消息 A demo里用的UART2 xff0
  • GPS数据格式解析

    GPS数据格式解析 简介 GPS发送数据以行为单位 xff0c 数据格式如下 xff1a 信息类型 xff0c x xff0c x xff0c x xff0c x xff0c x xff0c x xff0c x xff0c x xff0c
  • 线程的sleep()方法的简单使用

    线程的sleep方法签名位 xff1a public static void sleep long millis throws InterruptException 是静态方法 xff0c 使目前正在执行的线程休眠millis毫秒 pack
  • 栈和堆的生长方向

    C 43 43 作为一款C语言的升级版本 xff0c 具有非常强大的功能 它不但能够支持各种程序设计风格 xff0c 而且还具有C语言的所有功能 我们在这里为大家介绍的是其中一个比较重要的内容 xff0c C 43 43 内存区域的基本介绍
  • mysql关于bit类型用法

    本文来源于 xff1a http www server110 com mysql 201403 7117 html Mysql关于bit类型的用法 xff1a 官方的资料如下 xff1a 9 1 5 位字段值 可以使用b 39 value
  • Ajax 简单购物车工程

    工程结构图 xff1a index jsp lt 64 page language 61 34 java 34 contentType 61 34 text html charset 61 utf 8 34 pageEncoding 61
  • Oracle scott账户被锁定,scott默认密码,sys,system默认密码

    oracle帐号scott被锁定如何解锁 具体操作步骤如下 xff1a C gt sqlplus 请输入用户名 xff1a sys 输入口令 xff1a sys as sysdba 注意 xff1a 在口令这里输入 的密码后面必须要跟上 a
  • Linux将输出放到文件中

    一 xff0c 如何把命令运行的结果保存到文件当中 这个问题太简单了 xff0c 大家都知道 xff0c 用 gt 把输出转向就可以了 例子 lhd 64 hongdi ls gt ls txt lhd 64 hongdi cat ls t
  • 理解interrupt()方法

    java interrupt 方法只是设置线程的中断标记 xff0c 当对处于阻塞状态的线程调用interrupt方法时 xff08 处于阻塞状态的线程是调用sleep wait join 的线程 xff0c 会抛出InterruptExc
  • 泛型二 泛型和数组

    数组和泛型容器有什么区别 要区分数组和泛型容器的功能 xff0c 这里先要理解三个概念 xff1a 协变性 xff08 covariance xff09 逆变性 xff08 contravariance xff09 和无关性 xff08 i
  • 浏览器缓存

    阅读目录 1 浏览器缓存基本认识 2 强缓存的原理 3 强缓存的管理 4 强缓存的应用 5 协商缓存的原理 6 协商缓存的管理 7 浏览器行为对缓存的影响 浏览器缓存 xff0c 也就是客户端缓存 xff0c 既是网页性能优化里面静态资源相