原文链接

6.1. 一般概念

   HttpClient Cache提供了一个与HTTP / 1.1兼容的缓存层与HttpClient(浏览器缓存的Java等价物。)一起使用。该实现遵循责任链设计模式,其中缓存HttpClient实现可以为默认的非缓存HttpClient实现提供一个嵌入式替代; 完全可以从缓存满足的请求不会导致实际的原始请求。 使用条件GET和If-Modified-Since和/或If-None-Match请求标头,过期的缓存条目将尽可能使用原始地址进行自动验证。

  一般而言,HTTP / 1.1缓存被设计为在语义上是透明的; 也就是说,缓存不应该改变客户端和服务器之间请求 - 响应交换的含义。 因此,将缓存的HttpClient放入现有的兼容客户端 - 服务器关系中应该是安全的。 虽然缓存模块是从HTTP协议的角度来看是客户端的一部分,但实现的目标是与透明缓存代理的要求兼容。

  最后,缓存HttpClient的包括支持RFC 5861中指定的缓存控制扩展(陈旧-如果误差和陈旧·维持同时重新验证)。

当缓存HttpClient的执行请求时,它经过以下流程:

  1. 检查该请求以符合基本的HTTP1.1协议,并尝试修改该请求
  2. 刷新将被该请求无效的任何缓存条目。
  3. 确定当前请求是否可以从缓存中获取。 如果不是,直接将请求传递给原始服务器,并在适当的情况下缓存后返回响应。
  4. 如果它是缓存可加载请求,它将尝试从缓存中读取它。如果它不在缓存中,调用源服务器和缓存响应,如果合适的话。
  5. 如果缓存的响应适合作为响应,则构造包含ByteArrayEntity的BasicHttpResponse并将其返回。 否则,尝试对原始服务器重新验证缓存条目。
  6. 在无法进行重新验证缓存响应的情况下,调用原始服务器和缓存响应,如果合适的话。

当缓存HttpClient接收响应时,它经过以下流程:

  1. 检查响应的协议遵从性
  2. 确定响应是否可缓存
  3. 如果它是可缓存的,则尝试读取配置中允许的最大大小并将其存储在缓存中。
  4. 如果缓存的响应太大,请重新构建部分消耗的响应,并直接返回而不进行缓存。

请注意,缓存HttpClient本身不是HttpClient的不同实现,而是通过将自身作为附加处理组件插入到请求执行管道来工作。(备注:这一句是真的不好翻译)

6.2. RFC-2616 Compliance

  我们相信HttpClient缓存是无条件符合RFC-2616的。 也就是说,无论规范如何指示:必须、一定不能或者不应该为HTTP缓存,缓存层试图以满足这些要求的方式行事。 这意味着缓存模块在放入时不会产生不正确的行为。

6.3. Example Usage

  这是如何设置基本缓存HttpClient的简单示例。 按照配置,它将最多存储1000个缓存对象,每个对象的最大主体大小可能为8192字节。 这里选择的数字仅用于举例,并不打算作为规定或考虑为建议。

CacheConfig cacheConfig = CacheConfig.custom()
.setMaxCacheEntries(1000)
.setMaxObjectSize(8192)
.build();
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(30000)
.setSocketTimeout(30000)
.build();
CloseableHttpClient cachingClient = CachingHttpClients.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. 配置(Configuration)

  缓存HttpClient继承默认非缓存实现的所有配置选项和参数(这包括设置选项,如超时和连接池大小)。 对于特定于缓存的配置,可以提供一个CacheConfig实例来自定义以下行为:

  • 缓冲大小:如果后端存储支持这些限制,则可以指定最大缓存条目数以及最大可缓存响应主体大小。
  • 公/私人缓存:默认情况下,缓存模块认为自己是一个共享(公共)缓存,并且不会缓存对具有“缓存控制:私人”标记的授权头或响应的请求的响应。但是,如果缓存只会通过一个逻辑“用户”使用(类似行为的浏览器缓存),那么你将要关闭共享缓存设置。
  • 启发式缓存:根据RFC2616,即使没有明确的缓存控制头由原始设置,缓存也可以缓存某些缓存条目。这种行为在默认情况下是关闭的,但是如果您正在使用没有设置正确标题但您仍然想要缓存响应的源,则可能需要将其打开。您将希望启用启发式缓存,然后指定自上次修改资源以来的默认新鲜度生存期和/或时间的一小部分。有关启发式缓存的更多详细信息,请参阅HTTP / 1.1 RFC的13.2.2和13.2.4节。

6.5.后端存储(Storage Backends)

  缓存HttpClient的默认实现将缓存条目和缓存的响应实体存储在应用程序的JVM的内存中。虽然这提供了高性能,但由于大小限制或缓存条目短暂且在应用程序重新启动后无法运行,因此可能不适合您的应用程序。当前版本包括支持使用EhCache和memcached实现来存储缓存条目,这允许将缓存条目溢出到磁盘或将其存储在外部进程中。

Part2-HttpClient官方教程-Chapter6-HTTP缓存(HTTP Caching)的更多相关文章

  1. DroidParts 中文系列教程(基于官方教程)

    DroidParts中文系列教程(基于官方教程) (一)DroidParts框架概况 2014年4月18日星期五 11:36 他是一个精心构造的安卓框架,包括下面这些基本功能 DI依赖注入,可以注入V ...

  2. Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译

    本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  3. Google Guava官方教程(中文版)

    Google Guava官方教程(中文版) 原文链接  译文链接 译者: 沈义扬,罗立树,何一昕,武祖  校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库, ...

  4. Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图

    Asp.Net MVC4.0 官方教程 入门指南之三--添加一个视图 在本节中,您需要修改HelloWorldController类,从而使用视图模板文件,干净优雅的封装生成返回到客户端浏览器HTML ...

  5. Hololens官方教程精简版 - 08. Sharing holograms(共享全息影像)

    前言 注意:本文已更新到5.5.1f1版本号 本篇集中学习全息影像"共享"的功能,以实如今同一房间的人,看到"同一个物体".之所以打引號,是由于.每一个人看到的 ...

  6. RabbitMQ官方教程二 Work Queues(GOLANG语言实现)

    RabbitMQ官方教程二 Work Queues(GOLANG语言实现) 在第一个教程中,我们编写了程序来发送和接收来自命名队列的消息. 在这一部分中,我们将创建一个工作队列,该队列将用于在多个wo ...

  7. CRL快速开发框架系列教程六(分布式缓存解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. CRL快速开发框架系列教程五(使用缓存)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  9. Unity性能优化(4)-官方教程Optimizing graphics rendering in Unity games翻译

    本文是Unity官方教程,性能优化系列的第四篇<Optimizing graphics rendering in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

随机推荐

  1. 发送缓冲区sk_wmem_queued

    sk_wmem_queued是目前发送缓冲区的量 tcp_trim_head 把这快内存给去掉, 什么时候会加入到内存里呢?__tcp_add_write_queue_tail, skb里的内存是啥? ...

  2. java直接访问JNDI工具代码

    import java.sql.*; import java.util.*; import javax.naming.*; import javax.sql.DataSource; public cl ...

  3. [AHOI2009]中国象棋 DP,递推,组合数

    DP,递推,组合数 其实相当于就是一个递推推式子,然后要用到一点组合数的知识 一道很妙的题,因为不能互相攻击,所以任意行列不能有超过两个炮 首先令f[i][j][k]代表前i行,有j列为一个炮,有k列 ...

  4. BZOJ4518:[SDOI2016]征途——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4518 https://www.luogu.org/problemnew/show/P4072 Pi ...

  5. BZOJ4004:[JLOI2015]装备购买——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4004 https://www.luogu.org/problemnew/show/P3265 脸哥 ...

  6. BZOJ1876:[SDOI2009]SuperGCD——C++高精度良心题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1876 Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数 ...

  7. HDU.1233 还是畅通工程(Prim)

    HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...

  8. HDOJ.1009 FatMouse' Trade (贪心)

    FatMouse' Trade 点我挑战题目 题意分析 每组数据,给出有的猫粮m与房间数n,接着有n行,分别是这个房间存放的食物和所需要的猫粮.求这组数据能保证的最大的食物是多少? (可以不完全保证这 ...

  9. codevs5037 线段树练习4加强版(暴力分块)

    求大爷教线段树怎么写啊QAQ 只会写分块...一开始脑抽写成了O(NKlogN)还被CZL大爷嘲讽了一发T T f[i][j]表示在第i块中,模k为j的数有几个,然后每次修改的时候只需要打个标记,查询 ...

  10. 【P2602】【ZJOI2012】数字计数

    传送门 Description 给定两个正整数\(a\)和\(b\),求在\([a,b]\)中的所有整数中,每个数码(\(digit\))各出现了多少次. Input 两个正整数\(a,b\) Out ...