linux缓存系统学习之浏览器缓存

最近发现自己学习的东西太杂,不成系统,所以准备整理后再出发。整理也是一种升华。在学习的路上多总结,感觉很好!

这里从缓存开始说起,好久都没有写什么博客了,内容有不对的地方欢迎指正

好像大多问题都能通过加缓存解决,什么叫缓存呢,缓存就是把需要花费昂贵开销的计算结果保存起来,在之后访问直接取出,这个昂贵的开销可以是昂贵的计算,也可以是昂贵的带宽费用等等

从client端出发,首先来说说浏览器缓存,也许从某种角度上看,浏览器也是一个web服务器,也能算一级缓存,内部也存在的各种缓存协商的过程

last-modified

原理

这个从名字上就基本上能了解他是什么呢,最后一次修改时间,

流程图:

第一次访问的时候,web服务端首次返回给client端last-modified最后一次修改时间,然后再一次访问的时候,client请求头中就会以if-modified-since带入最后一次修改时间,用户询问web服务端,在这个时间之后有没有做过修改,如果没有,直接本地返回304状态,如果做了修改,从web服务端直接返回给用户,用户本地保存一份,然后下次已经这一次最后的修改时间为准!这个还是比较好理解!

配置

Apache last-modified是默认开启的

模块为:mod_headers.so

关闭方法

要关掉Last-Modified的方法麻烦点,先想好你要去掉Last-Modified 的标签.然后用header模块来控制

LoadModule headers_module modules/mod_headers.so
<FilesMatch "\.(gif|jpg|png)">
Header unset Last-Modified
< /FilesMatch>

不足

1、last-modified只能精确到秒,如果在秒内做了修改,是检测不到

2、如果是集群环境的话,相同文件的last-modified可能会不相同的,用户可能要缓存获取两次

3、不管你的内容有没有真正的修改

暂时只知道这几点不足

ETag

原理

ETag:网上的有很正确的理解,我个人的理解是在client端发起访问的时候,web服务端会在返回头中带入资源的ETag值(通过算法对内容进行一个计算得出的一个唯一id)客户端缓存这个资源,然后这个ETag值也会被保存,在再一次请求相同资源的时候,浏览器会把第一次服务端返回过来的值带入请求头中(if-none-match)如果服务端内容没有表换就返回304如果有变化就返回200内容从服务端返回,如果跟last-modified一起使用的话ETag优先级高于last-modified

配置

Apache

apache 默认开启Etag

格式:apache Etag由inode+大小+时间戳

关闭方式:

FileETag None
Header unset ETag
Header unset Last-Modified

nginx默认没有这个模块,需要重新编译进去

不足

1、没有进行实际的测试,感觉如果文件多了,大了,还有如果自己写的算法烂也会影响性能

expires

原理

这个最吊,直接可以不用跟web服务端进行缓存协商,本地协商就能完成,web服务端中返回head中带入过期时间,然后浏览器每一次只需要date与expires进行比较就好,如果过期就去服务端获取,如果没有过期就本地返回!

配置

Apache是通过expires模块实现

格式:

ExpiresActive on
ExpiresByType image/gif “access plus 1 month”
ExpiresByType image/jpg “access plus 1 month”
ExpiresByType image/jpeg “access plus 1 month”

。。。。。

nginx上面默认有的并开启状态

格式:

location ~ .*\.(js|css)?$
{
expires 1h;
}

不足:

1、expires受服务端跟client端时间影响,如果客户端时间如果慢了还是快了都会影响缓存的有效行,而客户端时间这种不可控的信息我们不能去实现时间一致

因为expires的不足,cache-control出来了

cache-control

原理

cache-control跟expires一样都是说明资源的一个有效时间,而不通的在于是expires是date时间到服务端给出的时间的一个有效时间,cache-control有效时间是client访问web服务端之后开始计算的一个时间内。如果max-ago=60 就是第一次访问后的60后资源过期,这样子就去除了expires依赖client时间的弊端,如果expires与cache-control同时存在,cache-control的优先级高于expires

nginx配置

if ($request_uri ~* "^/$|^arch/.+/|^/company/.+/") {
 add_header    Cache-Control  max-age=3600;

}
if ($request_uri ~* "^arch-suggest/|^/categories/") {
   add_header    Cache-Control  max-age=86400;
}

小注释:

浏览器的三种刷新方式:

  1. 使用浏览器的转到按钮、或者在地址栏直接回车、或者打开新窗口重新输入该网址

    优先走浏览器本地缓存,如果本地有缓存则根本不会访问服务器

    注:如果是chrome下,在本窗口下的地址栏直接回车,html不会走本地缓存,如果是新开窗口在地址栏输入网址回车,则html依然会走本地缓存。估计是chrome的策略,firefox下则都会走本地缓存

  2. 使用浏览器的刷新按钮、F5刷新或者是Mac Chrome下的Command + r刷新

    不走浏览器本地缓存,不过会走服务端缓存,会返回304

  3. 使用浏览器的强制刷新,如Ctrl+ F5或者是Mac Chrome下的Command + Shift + r

    既不走浏览器本地缓存,也不走服务端缓存,不返回304

无法被浏览器缓存的请求:

  1. HTTP信息头中包含Cache-Control:no-cache,pragma:no-cache,或Cache-Control:max-age=0等告诉浏览器不用缓存的请求
  2. 需要根据Cookie,认证信息等决定输入内容的动态请求是不能被缓存的
  3. 经过HTTPS安全加密的请求(有人也经过测试发现,ie其实在头部加入Cache-Control:max-age信息,firefox在头部加入Cache-Control:Public之后,能够对HTTPS的资源进行缓存,参考《HTTPS的七个误解》)
  4. POST请求无法被缓存
  5. HTTP响应头中不包含Last-Modified/Etag,也不包含Cache-Control/Expires的请求无法被缓存
时间: 2024-10-03 20:24:22

linux缓存系统学习之浏览器缓存的相关文章

【禁止缓存】如何禁止浏览器缓存页面内容

浏览器为了避免频繁地与服务器交互,提供了缓存功能.当频繁地访问同义jsp页面时,浏览器会将缓存中的结果取出为用户响应,并不向服务器发送请求,因此经常出现不能反映服务器最新处理结果的情况. 如果某个 jsp 或 servlet程序不需要客户浏览器缓存其相应内容,可以添加如下代码: response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-

HTTP协议控制浏览器缓存HTTP协议控制浏览器缓存

HTTP协议控制浏览器缓存 2015.01.25 SilenceHurts 当我们浏览网站的图片时,按下F12监控,很容易就发现,当我们第一次浏览该图片时,浏览器返回的代码是200,即请求正常,此时,不懂任何东西,我们按下F5刷新页面,注意,我们会发现监控下的代码返回不再是200,而是现实304 Not Modifid,即未修改. 原因:第一次我们访问图片时,是正常的,而第二次访问时现实304,因为此时我们浏览器发现页面未发生更改,此时使用的是本地的缓存,而并非服务器返回的代码,加快了速度. 设

Linux日志系统学习!!!

syslogd 的配置文件是/etc/syslog.conf  ,这个配置文件记录了 什么服务  在 什么等级下 需要记录在哪里!!! 服务: syslog本身设置了一些服务:syslog本身有一些服务,你可以通过这些服务来存储系统的信息 auth:与认证相关的机制  如ssh login su等 cron:  与工作调度相关生成信息日志的地方 dameon: 与各个daemon有关的信息 kern:   与内核查收信息的地方 lpr:  与打印相关的信息 mail:  与邮件收发有关的信息记录

Java缓存学习之二:浏览器缓存机制

浏览器端的九种缓存机制介绍 浏览器缓存是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存的机制种类较多,总体归纳为九种,这里详细分析下这九种缓存机制的原理和使用场景.打开浏览器的调试模式->resources左侧就有浏览器的8种缓存机制. 一.http缓存 http缓存是基于HTTP协议的浏览器文件级缓存机制.即针对文件的重复请求情况下,浏览器可以根据协议头判断从服务器端请求文件还是从

学习浏览器缓存(http缓存)

Q: 浏览器缓存是个什么东东,为什么要学习浏览器缓存涅? A: 浏览器缓存其实就是浏览器保存通过HTTP获取的所有资源,是浏览器将网络资源存储在本地的一种行为.浏览器缓存可以减少冗余数据的传输,减小服务器的负担,提高网站性能,页面利用缓存快速的响应. 任何事物都是有两面性滴,用的好,可以提升用户体验,用不好,还会降低用户体验. 缓存是什么时候用到的呢,这要从浏览器发起请求说起了, !(浏览器缓存)[https://user-gold-cdn.xitu.io/2019/1/21/1686e2735

Memcached高性能内存对象缓存系统

一.Memcached概述 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. 传统数据都保存在关系型数据库管理系统中(RDBMS关系型数据库管理系统),客户端请求时会从RDBMS中读取数据并在浏

浅谈缓存系统的三个问题

一.无处不在的缓存缓存在计算机系统是无处不在,在CPU层面有L1-L3的Cache,在Linux中有TLB加速虚拟地址和物理地址的转换,在应用层有Redis等内存数据库缓存.在浏览器有本地缓存.手机有本地文件缓存等等.可见,缓存在计算机系统中有非常重要的地位,主要作用就是提高响应速度.减少磁盘读取等,本文主要讨论在高并发系统中的缓存系统.一句话概括缓存系统在高并发系统中的地位的话,就是: 如果高并发系统是烤羊肉串,那么缓存系统就是那一撮孜然...... 二.高并发系统中的缓存 缓存系统的作用 缓

浏览器缓存机制详解

对于浏览器缓存,相信很多开发者对它真的是又爱又恨.一方面极大地提升了用户体验,而另一方面有时会因为读取了缓存而展示了"错误"的东西,而在开发过程中千方百计地想把缓存禁掉.那么浏览器缓存究竟是个什么样的神奇玩意呢? 什么是浏览器缓存: 简单来说,浏览器缓存就是把一个已经请求过的Web资源(如html页面,图片,js,数据等)拷贝一份副本储存在浏览器中.缓存会根据进来的请求保存输出内容的副本.当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是

浏览器缓存机制(1)

浏览器缓存机制之一(经典缓存) 因为在接手的项目中用到过比较新的HTML5应用缓存,也用到了经典的缓存如设置max-age,Etag之类,而之前一直就是在用着没有去深究其中原理.周末天气不好,懒得出去了,正好找时间总结下. 1.关于浏览器缓存 记得去年看<HTTP权威指南>的时候,有一章是专门讲浏览器缓存的,一年时间过得太快,逝去的时光还真是如同人群中消失的好姑娘,眼看她嫁给别人.我这里把浏览器缓存分为经典的浏览器缓存(以下简称为经典缓存)和HTML5应用缓存这两类. 经典的浏览器缓存其实主要