`

HttpClient 4.3教程 第六章 HTTP缓存

 
阅读更多

 

6.1.基本概念

HttpClient的缓存机制提供一个与HTTP/1.1标准兼容的缓存层 – 相当于Java的浏览器缓存。HttpClient缓存机制的实现遵循责任链(Chain of Responsibility)设计原则,默认的HttpClient是没有缓存的,有缓存机制的HttpClient可以用来临时替代默认的HttpClient,如果开启了缓存,我们的请求结果就会从缓存中获取,而不是从目标服务器中获取。如果在Get请求头中设置了If-Modified-Since或者If-None-Match参数,那么HttpClient会自动向服务器校验缓存是否过期。

HTTP/1.1版本的缓存是语义透明的,意思是无论怎样,缓存都不应该修改客户端与服务器之间传输的请求/响应数据包。因此,在existing compliant client-server relationship中使用带有缓存的HttpClient也应该是安全的。虽然缓存是客户端的一部分,但是从Http协议的角度来看,缓存机制是为了兼容透明的缓存代理。

最后,HttpClient缓存也支持RFC 5861规定的Cache-Control拓展(stale-if-error'和stale-while-revalidate`)。

当开启缓存的HttpClient执行一个Http请求时,会经过下面的步骤:

  • 检查http请求是否符合HTTP 1.1的基本要求,如果不符合就尝试修正错误。
  • 刷新该请求无效的缓存项。(Flush any cache entries which would be invalidated by this request.)
  • 检测该请求是否可以从缓存中获取。如果不能,直接将请求发送给目标服务器,获取响应并加入缓存。
  • 如果该请求可以从缓存中获取,HttpClient就尝试读取缓存中的数据。如果读取失败,就会发送请求到目标服务器,如果可能的话,就把响应缓存起来。
  • 如果HttpClient缓存的响应可以直接返回给请求,HttpClient就会构建一个包含ByteArrayEntityBasicHttpResponse对象,并将它返回给http请求。否则,HttpClient会向服务器重新校验缓存。
  • 如果HttpClient缓存的响应,向服务器校验失败,就会向服务器重新请求数据,并将其缓存起来(如果合适的话)。
    当开启缓存的HttpClient收到服务器的响应时,会经过下面的步骤:
  • 检查收到的响应是否符合协议兼容性
  • 确定收到的响应是否可以缓存
  • 如果响应是可以缓存的,HttpClient就会尽量从响应消息中读取数据(大小可以在配置文件进行配置),并且缓存起来。
  • 如果响应数据太大,缓存或者重构消耗的响应空间不够,就会直接返回响应,不进行缓存。
    需要注意的是,带有缓存的HttpClient不是HttpClient的另一种实现,而是通过向http请求执行管道中插入附加处理组件来实现的。

6.2. RFC-2616 Compliance

HttpClient的缓存机制和RFC-2626文档规定是无条件兼容的。也就是说,只要指定了MUSTMUST NOTSHOULD或者SHOULD NOT这些Http缓存规范,HttpClient的缓存层就会按照指定的方式进行缓存。即当我们使用HttpClient的缓存机制时,HttpClient的缓存模块不会产生异常动作。

6.3. 使用范例

下面的例子讲述了如何创建一个基本的开启缓存的HttpClient。并且配置了最大缓存1000个Object对象,每个对象最大占用8192字节数据。代码中出现的数据,只是为了做演示,而过不是推荐使用的配置。

    CacheConfig cacheConfig = CacheConfig.custom()
            .setMaxCacheEntries(1000)
            .setMaxObjectSize(8192)
            .build();
    RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(30000)
            .setSocketTimeout(30000)
            .build();
    CloseableHttpClient cachingClient = caching HttpClients.custom()
            .setCacheConfig(cacheConfig)
            .setDefaultRequestConfig(requestConfig)
            .build();

    HttpCacheContext context = HttpCacheContext.create();
    HttpGet httpget = new HttpGet("http://www.mydomain.com/content/");
    CloseableHttpResponse response = cachingClient.execute(httpget, context);
    try {
        CacheResponseStatus responseStatus = context.getCacheResponseStatus();
        switch (responseStatus) {
            case CACHE_HIT:
                System.out.println("A response was generated from the cache with " +
                        "no requests sent upstream");
                break;
            case CACHE_MODULE_RESPONSE:
                System.out.println("The response was generated directly by the " +
                "caching module");
                break;
            case CACHE_MISS:
                System.out.println("The response came from an upstream server");
                break;
            case VALIDATED:
                System.out.println("The response was generated from the cache " +
                "after validating the entry with the origin server");
                break;
        }
    } finally {
        response.close();
     }

6.4. 配置

有缓存的HttpClient继承了非缓存HttpClient的所有配置项和参数(包括超时时间,连接池大小等配置项)。如果需要对缓存进行具体配置,可以初始化一个CacheConfig对象来自定义下面的参数:

  • Cache size(缓存大小). 如果后台存储支持,我们可以指定缓存的最大条数,和每个缓存中存储的response的最大size。
  • Public/private cacheing(公用/私有 缓存). 默认情况下,缓存模块会把缓存当做公用的缓存,所以缓存机制不会缓存带有授权头消息或者指定Cache-Control:private的响应。但是如果缓存只会被一个逻辑上的用户使用(和浏览器饿缓存类似),我们可能希望关闭缓存共享机制。
  • Heuristic caching(启发式缓存)。即使服务器没有明确设置缓存控制headers信息,每个RFC2616缓存也会存储一定数目的缓存。这个特征在HttpClient中默认是关闭的,如果服务器不设置控制缓存的header信息,但是我们仍然希望对响应进行缓存,就需要在HttpClient中打开这个功能。激活启发式缓存,然后使用默认的刷新时间或者自定义刷新时间。更多启发式缓存的信息,可以参考Http/1.1 RFC文档的13.2.2小节,13.2.4小节。
  • Background validation(后台校验)。HttpClient的缓存机制支持RFC5861的stale-while-revalidate指令,它允许一定数目的缓存在后台校验是否过期。我们可能需要调整可以在后台工作的最大和最小的线程数,以及设置线程在回收前最大的空闲时间。当没有足够线程来校验缓存是否过期时,我们可以指定排队队列的大小。

6.4.存储介质

默认,HttpClient缓存机制将缓存条目和缓存的response放在本地程序的jvm内存中。这样虽然提供高性能,但是当我们的程序内存有大小限制的时候,这就会变得不太合理。因为缓存的生命中期很短,如果程序重启,缓存就会失效。当前版本的HttpClient使用EhCache和memchached来存储缓存,这样就支持将缓存放到本地磁盘或者其他存储介质上。如果内存、本地磁盘、外地磁盘,都不适合你的应用程序,HttpClient也支持自定义存储介质,只需要实现HttpCacheStorage接口,然后在创建HttpClient时,使用这个接口的配置。这种情况,缓存会存储在自定义的介质中,但是you will get to reuse all of the logic surrounding HTTP/1.1 compliance and cache handling. 一般来说,可以创建出支持任何键值对指定存储(类似Java Map接口)的HttpCacheStorage,用于进行原子更新。

最后,通过一些额外的工作,还可以建立起多层次的缓存结构;磁盘中的缓存,远程memcached中的缓存,虚拟内存中的缓存,L1/L2处理器中的缓存等。

 

分享到:
评论

相关推荐

    httpclient4.3工具类

    6. **重定向处理**:HttpClient 4.3提供自动处理HTTP重定向的能力,可以根据需要配置是否遵循重定向以及重定向的最大次数。 7. **认证和安全**:HttpClient支持基本认证、NTLM、Kerberos等多种认证机制,并且可以...

    HttpClient4.3教程共51页.pdf.zip

    这个教程可能是针对开发者设计的,帮助他们深入理解和有效地使用HttpClient 4.3进行网络请求。 HttpClient 4.3的关键知识点包括: 1. **基本概念**:HttpClient主要处理HTTP请求和响应,包括GET、POST、PUT、...

    httpclient4.3 封装工具类

    HttpClient 4.3版本是对该库的一次重要更新,提供了更多的功能和优化。这个封裝工具类是对HttpClient 4.3进行的二次开发,旨在简化HTTP请求的处理,解决一些常见的问题,如代理设置、多线程并发请求、SSL安全连接...

    httpclient4.3.x及其依赖jar包

    《HttpClient 4.3.x详解及其依赖分析》 HttpClient是一个由Apache基金会开发的Java库,主要用于执行HTTP请求。HttpClient 4.3.x是该库的一个重要版本,它提供了丰富的功能和改进,使得开发者能够更方便地与Web...

    httpclient4.3 和 httpcore4.4

    《HttpClient 4.3与HttpCore 4.4详解》 在Java开发中,HttpClient库是进行HTTP通信的重要工具,而HttpCore则是HttpClient的核心组件,它们共同为开发者提供了强大且灵活的HTTP客户端服务。本文将深入探讨HttpClient...

    httpClient4.3 Jar包 demo

    在这个"httpClient4.3 Jar包 demo"中,你将找到HttpClient 4.3的jar文件以及相关的示例代码,对于学习和理解HttpClient的使用非常有帮助。 HttpClient 4.3主要知识点包括: 1. **基础概念**: - **HttpClient对象...

    httpClient4.3官方包

    6. **重定向处理**:HttpClient 4.3能够自动处理HTTP状态码为3xx的重定向,用户也可以自定义重定向策略。 7. **实体编码和传输**:HttpClient支持多种编码方式,如`ChunkedEncoding`和`Content-Length`编码,以及`...

    httpClient4.3

    HttpClient 4.3 是 Apache 开源组织提供的一款用于执行 HTTP 请求的 Java 库。这个库在 Java 开发中被广泛使用,特别是在需要与 Web 服务器交互或者进行 API 调用时。HttpClient 4.3 版本是该库的一个稳定版本,提供...

    HttpClient4.3需要的jar

    6. **连接管理**:HttpClient 4.3引入了更完善的连接管理机制,如`PoolingHttpClientConnectionManager`,可以控制连接池的大小,提高性能并避免过多的连接创建。 7. **请求与响应**:HttpClient支持自定义请求头、...

    HttpClient 4.3教程.rar

    本教程将详细介绍HttpClient 4.3的主要特性和使用方法。 一、HttpClient简介 HttpClient是一个Java库,它允许开发人员执行HTTP和HTTPS请求,并处理响应。它支持各种HTTP方法(如GET、POST、PUT、DELETE等),提供了...

    httpclient-4.3.jar

    4. 缓存支持:通过HttpCache模块,HttpClient 4.3支持HTTP响应缓存,减少网络请求,提高响应速度。 5. 精细化的错误处理:HttpClient 4.3提供了丰富的异常类型,方便开发者处理各种可能出现的问题。 三、使用方法 ...

    httpclient 4.3 中文版

    ### HttpClient 4.3 中文版相关知识点 #### 一、概述 Apache HttpClient 是一个用于构建 HTTP 客户端的应用程序编程接口 (API),属于 Apache Jakarta Commons 的一部分。该库支持 HTTP 协议的最新标准,并提供了...

    HTTPClient 4.3.X

    标题 "HTTPClient 4.3.X" 涉及的是Apache HttpClient库的一个版本,这是一个广泛使用的Java库,用于实现客户端HTTP通信。这个库为开发者提供了丰富的功能,包括发送HTTP请求,处理响应,管理连接池,处理cookies,...

    httpclient4.3所需jar包

    HTTPClient是Java编程中用于处理HTTP协议的库,版本4.3是一个常用且稳定的版本。在进行网络爬虫开发时,HTTPClient库扮演了至关重要的角色,它提供了丰富的功能,如发起HTTP请求、处理响应、管理Cookie、实现重试...

    HttpClient 4.3教程.docx

    HttpClient 4.3教程 HttpClient是Apache基金会下的一个开源项目,提供了一个功能强大且灵活的HTTP客户端库。HttpClient致力于填补Java中的空白,提供了一个功能丰富的HTTP客户端库,可以实现HTTP客户端的各种需求。...

    httpclient4.3中文教程

    HttpClient 4.3 是 Apache 开源组织提供的一个用于构建 HTTP 客户端应用程序的强大库,主要专注于 HTTP 协议的实现。它建立在 HttpCore 库之上,支持传统的阻塞 I/O 模型,适用于各种需要高效、可控的 HTTP 交互的...

    HttpClient4.3教程.PDF

    ### HttpClient4.3教程知识点详解 #### 一、引言 在互联网技术中,HTTP协议作为数据通信的基础标准之一,其重要性不言而喻。随着互联网应用的不断发展与变化,HTTP协议也在不断地进化和扩展,以适应更多场景的需求...

    HttpClient4.3教程 PDF格式

    于是,便诞生了Apache HttpClient这样的第三方库,其主要目的是为了提供更为丰富和高效的HTTP客户端功能。 Apache HttpClient是一个开源的Java HTTP客户端库,主要用于执行HTTP方法,如GET、POST、PUT、DELETE等。...

    httpClient4.3文档 PDF

    HttpClient 4.3是其一个重要的版本,提供了许多新特性和改进,以提升性能和易用性。这个压缩包包含两份文档,一份是.docx格式,一份是.pdf格式,两者内容相同,都是关于HttpClient 4.3的中文版指南。 HttpClient的...

    httpclient4.3 设置代理

    javase http通讯技术 apache httpclient4.3 设置代理详解

Global site tag (gtag.js) - Google Analytics