java http缓存

HTTP/1.1中缓存的目的是为了在很多情况下减少发送请求,也即直接返回缓存;同时在许多情况下可以不需要发送完整响应。前者减少了网络回路的数量,挺高响应速度,HTTP利用一个“过期(expiration)”机制来为此目的。后者减少了网络应用的带宽,HTTP用“验证(validation)”机制来为此目的。

HTTP定义了3种缓存机制:

Freshness allows a response to be used without re-checking
it on the origin server, and can be controlled by both the server and the client. For example, the Expires response header gives a date when the document becomes stale, and the Cache-Control: max-age directive tells
the cache how many seconds the response is fresh for.

Validation can be used to check whether a cached response
is still good after it becomes stale. For example, if the response has a Last-Modified header, a cache can make a conditional request using the If-Modified-Since header
to see if it has changed.

Invalidation is usually a side effect of another request that passes
through the cache. For example, if URL associated with a cached response subsequently gets a POST, PUT or DELETE request, the cached response will be invalidated.

 

缓存如何工作

所有的缓存都用一套规则来帮助他们决定什么时候使用缓存中的副本提供服务(假设有副本可用的情况下);一些规则在协议中有定义(HTTP协议1.0和1.1),一些规则由缓存的管理员设置(浏览器的用户或者代理服务器的管理员);
一般说来:遵循以下基本的规则(不必担心,你不必知道所有的细节,细节将随后说明)

  1. 如果响应头信息:告诉缓存器不要保留缓存,缓存器就不会缓存相应内容;
  2. 如果请求信息是需要认证或者安全加密的,相应内容也不会被缓存;
  3. 如果在回应中不存在校验器(ETag或者Last-Modified头信息),缓存服务器会认为缺乏直接的更新度信息,内容将会被认为不可缓存。
  4. 一个缓存的副本如果含有以下信息:内容将会被认为是足够新的
    • 含有完整的过期时间和寿命控制头信息,并且内容仍在保鲜期内;
    • 浏览器已经使用过缓存副本,并且在一个会话中已经检查过内容的新鲜度;
    • 缓存代理服务器近期内已经使用过缓存副本,并且内容的最后更新时间在上次使用期之前;
    • 够新的副本将直接从缓存中送出,而不会向源服务器发送请求;
  5. 如果缓存的副本已经太旧了,缓存服务器将向源服务器发出请求校验请求,用于确定是否可以继续使用当前拷贝继续服务;

总之:新鲜度校验是确定内容是否可用的最重要途径:

 

如果副本足够新,从缓存中提取就立刻能用了;
而经缓存器校验后发现副本的原件没有变化,系统也会避免将副本内容从源服务器整个重新传输一遍。

时间: 2024-12-27 21:14:52

java http缓存的相关文章

Java开源缓存系统的介绍

缓存 几种java开源缓存系统的性能比较: 以下是几个著名java开源缓存系统的介绍: OSCacheOSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案.OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存.拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性.永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive

Java日志缓存机制的实现

概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打 印的日志级别,这样就会带来一些不便. 在 JDK 提供的日志功能中,日志级别被细化为 9 级,用以 区分不同日志的用途,用来记录一个错误,或者记录正常运行的信息,又或是记录详细的调试信息.由于日志 级别是静态的,如果日志级别设定过高,低级别的日志难以打印出来,从而导致在错误发生时候,难以去追踪 错误

更新-最近学习java的缓存机制,请大家看看我的代码有什么不足

问题描述 最近学习java的缓存机制,请大家看看我的代码有什么不足 一个简单的测试类,如果在高并发下会有问题么 package com.test.cache;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class CacheManager { private volatile static CacheManager cacheManager;//缓存类的实例 private long upDa

java后台缓存对象的问题

问题描述 java后台缓存对象的问题 现在有这样一个场景,业务层调用远程webservice获取的结果传输到前台但只需要显示几个关键字段,待用户查询完毕后点击提交这些结果全部数据都要保存,在后台如何缓存这个查询结果?有用过在业务层增加一个属性来保存这个查询结果但是感觉不是太好,大家一般是怎么做的讨论一下,小弟在这里先谢谢啦. 解决方案 用Ehcache啊,查询完了放进Ehcache. 需要用了去Ehcache中去,类似于Map 解决方案二: 不需要缓存查询结果,只要有主键匹配上就可以了.

基于java语音缓存系统的研究与设计,怎么写毕业论文???是否需要做一个系统

问题描述 基于java语音缓存系统的研究与设计,怎么写毕业论文???是否需要做一个系统 这个东西是什么>??是否需要做出一系统,这个论文怎么写,谁帮写好能通过重谢 解决方案 这个应该是不需要做一个系统的,这并不是一个项目或者安卓的app,并不是偏向实践方向的,而是更偏向理论放心吧.个人理解,具体的建议你问问你的导师吧 解决方案二: 如果你什么都不会,那就胡乱抄抄类似的文章吧google总会用吧.http://www.docin.com/p-65599058.html 解决方案三: butaiqi

spring mvc-redis与java实现缓存查询,log日志

问题描述 redis与java实现缓存查询,log日志 我现在开发遇到两个难点,大伙给我个思路.....1.用户要求保存数据更新日志,要求有数据原值,跟修改后的值.我倒是想到几个办法,但是感觉太麻烦,有没有简略的.2.redis缓存,用户查询的数据要用redis存起来,这样的话查询条件怎么处理,我不能一个查询条件就保存一条结果缓存吧.redis对数据操作能做到根据条件吗?注:我们的开发框架是springmvc+mybaits. 解决方案 直接存库再根据用户ID或者时间分表,只是插入和查询的话,性

JAVA 开源缓存框架

  JBossCache/TreeCache  JBossCache是一个复制的事务处理缓存,它允许你缓存企业级应用数据来更好的改善性能.缓存数据被自动复制,让你轻松进行Jboss服务器之间的集群工作.JBossCache能够通过Jboss应用服务或其他J2EE容器来运行一个Mbean服务,当然,它也能独立运行. JBossCache包括两个模块:TreeCache和TreeCacheAOP. TreeCache --是一个树形结构复制的事务处理缓存. TreeCacheAOP --是一个"面向

基于Java实现缓存Cache的深入分析_java

原理是使用LinkedHashMap来实现,当缓存超过大小时,将会删除最老的一个元组.实现代码如下所示 复制代码 代码如下: import java.util.LinkedHashMap;import java.util.Map;public class LRUCache { public static class CachedData {  private Object data = null;  private long time = 0;  private boolean refreshi

Java资源缓存 之 LruCache_java

例如对 网络加载图片进行缓存 : // 得到 应用程序 被分配的最大的内存 int maxMemory=(int) Runtime.getRuntime().maxMemory(); // 取处内存的 1/5 用来当 缓存 大小 int cachSize=maxMemory/5; // 实例化 LruCache lruCache=new lruCache<String, Bitmap>(cachSize){ //内部方法sizeOf设置每一张图片的缓存大小 protected int size

java绘制缓存图像示例

用java绘制图像时候,为了速度,需要缓存图像.写一个示例代码,供参考.   import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Transparency;import java.awt.event.WindowAdapter;import java.awt.event.Wi