1.1 缓存解释

缓存通常是基于键值对来缓存的,键通过hash计算后,存放于内存某个空间,所以键可以理解为索引。而值是存放在内存空间或是磁盘空间上。

当用户的用户请求送达至Web服务器,Web服务器会对URL进行hash计算,然后比对缓存(hash表)中的键。如若命中,则根据与之对应的值找到数据存放的位置(这里的值可以理解为指针,指着对应数据存放的位置),从而获取到缓存的结果。

1.2 工作原理

1.2.1    缓存命中

① 客户端请求某个Web数据,会先送至缓存服务器中,缓存服务器本身会监听80号端口接收用户请求

② 当Web缓存服务器收到用户请求之后,会将这个请求送达至代理进程中

③ 进程拆除用户请求报文中的应用层首部,TCP首部,IP首部等,从而获取到请求报文中的URL

④ 对URL进行hash计算,然后和缓存服务器中hash表中的缓存键进行比对,若一致则缓存命中

⑤ 在对应的值所指向的内存或硬盘空间上找到对应的内容数据

⑥构建成响应报文,直接返回给客户端

1.2.2    缓存未命中

① 客户端请求某个Web数据,会先送至缓存服务器中,缓存服务器本身会监听80号端口接收用户请求

② 当Web缓存服务器收到用户请求之后,会将这个请求送达至代理进程中

③ 进程拆除用户请求报文中的应用层首部,TCP首部,IP首部等,从而获取到请求报文中的URL

④ 对URL进行hash计算,然后和缓存服务器中hash表中的缓存键进行比对,不一致则缓存未命中

⑤ 代理服务器会自行封装成请求报文,把自己当做http的客户端,向上游服务器发起请求

⑥ 若内容存在,上游服务器会构建成响应报文,返回给代理服务器。

⑦ 当代理服务器收到响应之后,会检查该对象是否可以缓存,如若可以,会对URL进行hash之后生成一个键,存放到对应的hash表中

⑧ 在相应的内存或磁盘空间上存储对应的内容数据

⑨ 当操作完成之后,会将数据构建成相应报文,然后响应给客户端

1.3 扩展

在用户自己内部的浏览器会有自己的缓存(私有缓存),当用户请求一个首页的时候,会向代理服务器请求,之后缓存在本地的一些链接或者图片,如果在本地存在缓存,那么就直接响应给用户,而无需再向代理服务器请求。所以我们的缓存是有存在多级的

二、缓存失效

现在存在一个问题,那就是如果我们的缓存失效了应该如何处理,正常而已如果缓存过期了,我们应该不再使用此缓存。所以缓存是具有TTL(生命时间值)值的,当这个TTL值过期之前,我们可以正常使用此缓存对象,一旦过期,请求一方就只能到比他更高一级的下一层缓存中的后端服务器去请求资源。

假设某个缓存对象可以缓存7天,但是在第2天,后端服务器已经修改了此对象,那么此时应该如何处理。所以用户如果直接从缓存中获取到的数据就已经不是最新的了。这样可能会导致缓存有效期过期之前用户将无法获取有效的结果。那么如果处理呢?

2.1 缓存的方式

基于绝对时间缓存
在http 1.0时使用的是绝对时间来缓存,可以理解精准的时间算法

基于条件式缓存

到 1.1版本以后,对其缓存功能进行了扩展,引入了几种功能

1、引入相对时长过期时间
2、引入强大可缓存对象控制功能(哪些数据能缓存以及不能缓存)
3、引入条件式缓存

2.2 基于绝对时间

比方说,此次缓存时为中国时区的2016年7月3日9:00 缓存的,缓存的TTL值为7天,那么过期时间应该就是 7天之后(2016年7月10日)9:00 过期,但是如果是在美国,或者欧洲,因为时区的不同,使用绝对时间将会导致缓存缓存不

2.3 基于条件式缓存

基于最后一次缓存时间后询问式验证请求

当用户访问同一个URL时,会发现在自己的缓存空间中存在一个相同的缓存对象,此时他不会了立即使用此缓存,而是去向上游服务器去验证这个缓存是否过期。主动向服务器发起验证请求,去请求一个URL,而且会发一个独特的请求首部(If-Modified-Sinces:time),询问在此时间之后(也就是缓存对象建立的时间之后),你是否发生了修改。如果后端服务器发现此资源未修改,会响应304(原始数据未修改)的响应码,由于资源未改变,所以此处发送的仅仅是响应码,数据无需发送。当客户端接收到响应后,就会直接使用本地的缓存。

如果后端服务器发现此资源已经修改,那么会找到对应的资源,然后发一个200(原始数据已修改)的响应码,并将资源发送给客户端。当客户端接收到后,会替换原先缓存下来的结果,并在浏览器上进行显示。
但是基于时间来记录判定其实并不理想,假设用户发验证时,而你的服务器时间并未到那个时间,那么就会无法验证缓存时间了。

基于标签(tag)进行条件式请求

在服务器端,每一个文件、或者是资源,每次版本修改之后都会附带一个tag(这个tag可能是一个随机生成的数,所以可以理解具有唯一性)。当用户请求资源后,会发送一个独特的请求首部(If-None-Match:tag),会将本地缓存的tag发送给服务器端,询问资源的tag是否匹配,匹配则资源未改变,响应304响应码,否则资源已改变,响应200响应码。

所以这样就不会担心基于时间记录时所产生的各种问题。

三、HTTP的缓存工作模式

3.1 基于缓存过期时间

1、当用户第一次访问资源时,缓存服务器不存在对应的缓存对象,那么此时缓存服务器会向后端服务器请求数据,后端服务器会数据响应给缓存服务器,并附带Cache-Control首部信息,表示缓存的时间。然后缓存服务器会将数据缓存于本地,然后将数据响应给客户端。

2、当客户端再次请求同一个资源时,如果缓存时间未到期,那么此时缓存服务器会直接将用户请求的资源直接响应给客户端。

3、如果当客户端请求资源时发现缓存服务器里的缓存周期已过期,那么此时缓存服务器会向后端请求资源,并将信息资源缓存于本地,而此时也更新了缓存的TTL值,然后响应给客户端。

3.2 基于条件式缓存

1、当客户端第一次请求资源时,由于缓存服务器并没有响应的缓存资源,那么此时缓存服务器会向后端服务器发起资源请求。当后端服务器收到请求后,会响应缓存服务器的请求,并附带Last-Modified:time的首部信息,缓存服务器会将资源及Last-Modified信息缓存于本地,然后一同也将这些信息响应给客户端。

2、客户端发起资源请求,如果缓存服务器有对应的资源缓存条目,但是此时客户端不会直接使用,而是发送了If-Modified-Since:time请求首部给后端服务器,来询问是否数据未修改。如数据未修改,会返回304的响应码,那么此时客户端会直接使用缓存服务器里的资源。

3、类似上面的方法,但是如果后端服务器响应的是200(数据已修改)的响应码时,那么缓存服务器会接受下这段响应信息,并将数据缓存于本地,然后再讲资源 + Last-Modified响应信息发回给客户端。

3.3 组合应用HTTP首部

根据上面的介绍,我们知道,如果基于时间来判断,可能会导致数据不准确的情况。而使用基于条件式的缓存可以弥补基于时间的不足,但是它自身还有一个缺点,那就是需要不断的去询问后端服务器的数据。这样就消耗占用了后端服务器的资源以及带宽。所以我们可以使用基于两种方式的合并来完成缓存失效判断。

1、第一次用户访问,那么类似前面介绍的方法,不同的是,此时缓存服务器会记录 Etag信息和 Cache-Control信息。

2、如果客户端请求的相同的资源,如果缓存未过期,那么此时使用的仍然是缓存服务器上的资源。

3、当缓存服务器的资源已失效,那么客户端会向后端服务器发起If-None-Match:Etag请求首部,向后端服务器确认资源是否已被修改,如果资源未修改,此时服务器会响应304(资源未修改)的响应码,那么缓存服务器会更新TTL值,并响应给客户端。

转载于:https://blog.51cto.com/imork/1878619

web cache缓存原理相关推荐

  1. web cache缓存设备的需求与讨论 ( Http://CACHE.MARASYSTEMS.ASIA )

    1.1  宽带用户需求分析 ( HTTP://CACHE.MARASYSTEMS.ASIA ) 面对主流宽带运营商(电信.联通)的强大资源优势,移动.广电处于不利局面.申请和使用线路会遇到一定麻烦,同 ...

  2. Spring Cache 缓存原理与 Redis 实践

    说到Spring Boot缓存,那就不得不提JSR-107规范,它告诉我们在Java中如何规范地使用缓存. JSR是Java Specification Requests的简称,通常译为"J ...

  3. Web Cache原理,你真的造吗?

    一.Web Cache 在介绍Web cache时,我们需要简单介绍缓存的理解 1.1 缓存解释 缓存通常是基于键值对来缓存的,键通过hash计算后,存放于内存某个空间,所以键可以理解为索引.而值是存 ...

  4. OkHttp原理第五篇-Cache缓存类详解

    ✨作者简介:00后,22年刚刚毕业,一枚在鹅厂搬砖的程序员. ✨前置任务:本篇是CacheInterceptor的补充文章,重点讲解OkHttp的缓存类,读者最好也了解下,虽然不太影响后续文章的阅读, ...

  5. .net System.Web.Caching.Cache缓存类使用详解(转载)

    转自:http://www.cnblogs.com/virusswb/articles/1681561.html net System.Web.Caching.Cache缓存类使用详解 System. ...

  6. Web缓存中毒(web cache poisoning)学习笔记

    笔者burpsuite的在线安全学院的web cache poisoning学习笔记.限于本人水平,笔记质量不是很高,假如有看到的大佬轻喷,很多地方是Google翻译的. 首先推荐篇翻译的文章,方便理 ...

  7. 浅谈web cache的简单原理

    小普在最近学习WEB相关的过程中,发现了web cache是一个很有趣的点,所以这次要和大家分享的,就是关于web cache的一些个人的理解. 在介绍Web cache时,我们需要简单介绍缓存的理解 ...

  8. 开启mybatis日志_Mybatis源码分析之Cache二级缓存原理 (五)

    一:Cache类的介绍 讲解缓存之前我们需要先了解一下Cache接口以及实现MyBatis定义了一个org.apache.ibatis.cache.Cache接口作为其Cache提供者的SPI(Ser ...

  9. 操作系统原理_读懂操作系统之缓存原理(cache)(三)

    本节内容计划是讲解TLB与高速缓存的关系,但是在涉及高速缓的前提是我们必须要了解操作系统缓存原理,所以提前先详细了解下缓存原理,我们依然是采取循序渐进的方式来解答缓存原理,若有叙述不当之处,还请批评指 ...

最新文章

  1. shell 批量转换文件编码
  2. 香河php程序员_失控的香河最流行的四大职位
  3. 实现自己的连接池(一)
  4. .NET(C#):警惕PLINQ结果的无序性
  5. python 可变参数 关键字参数_Python关键字及可变参数*args,**kw原理解析
  6. js实现语音播报功能
  7. mysql 安装手册(转)
  8. Oracle 数字与空值的排序问题
  9. 购物中心潮--我的创业之路
  10. python数组遍历输出所有组合_python遍历列表和数组实例讲解
  11. Qt文档阅读笔记-Object Trees Ownership解析与实例(为何某些程序在被关闭的时候会崩溃)
  12. [python]网络编程基础学习笔记(一)客户/服务器网络介绍
  13. HDU2019 数列有序!【入门】
  14. 【转】Java 中正确使用 hashCode 和 equals 方法
  15. 地图上导出坐标html文件,如何将标签的坐标、海拔等属性导出到TXT文本中
  16. 解决Gmail不能正常登录的问题,并推荐几个小窍门 [转]
  17. MongoDB简单学习小总结
  18. vue手动封装分页组件
  19. java io broken pipe解决_报错!!java.io.IOException: 断开的管道 中文报错?Broken pipe?这次发生的报错不影响业务,已有解决方案...
  20. 线程和协程详解-python

热门文章

  1. 快速人群密度估计--Multi-scale Convolutional Neural Networks for Crowd Counting
  2. 给VMware虚拟机增加硬盘容量:Linux/Windows系统
  3. 服务器默认字符集 网页乱码,关于apache默认字符集乱码的问题
  4. 计算机系统上线保障计划,系统运维信息系统运行保障方案计划新.docx
  5. 性能压测服务器502报错,一种交易系统的性能测试方法及相关服务器
  6. Elasticsearch 常用配置参数总结
  7. Jvm 系列(三):GC 算法 垃圾收集器
  8. Java并发的类库_Java 并发类库AbstractQueuedSynchronizer 分析
  9. mysql update 有中文_MySQL Update语句一个非常经典的“坑”
  10. 运维企业专题(5)LVS高可用与负载均衡中篇——VS/DR模式配置详解