Java 服务器端缓存

Java 服务器端缓存,java,caching,wildfly,wildfly-9,Java,Caching,Wildfly,Wildfly 9,我有一个独立的WildFly 9.0.2,我想在服务器端缓存某些请求的响应 一些请求可供所有用户(访问者)使用,其他请求应仅可供经过身份验证的用户使用 从文档中我不明白如何做到这一点。 你能给我指一下实现这个功能的教程或手册吗 我使用standalone\configuration\standalone.xml中的Infispan默认配置启动了wildfly 然后,我修改了response对象,使其包含用于缓存的头信息,希望它能像JAX-RS一样工作,检查头并自动缓存 final HttpSer

我有一个独立的WildFly 9.0.2,我想在服务器端缓存某些请求的响应

一些请求可供所有用户(访问者)使用,其他请求应仅可供经过身份验证的用户使用

从文档中我不明白如何做到这一点。 你能给我指一下实现这个功能的教程或手册吗

我使用standalone\configuration\standalone.xml中的Infispan默认配置启动了wildfly

然后,我修改了response对象,使其包含用于缓存的头信息,希望它能像JAX-RS一样工作,检查头并自动缓存

final HttpServletResponse response
long current = System.currentTimeMillis();
long expires = current + 86400000;
response.setHeader("Cache-Control", "no-transform, max-age="+ 86400 + ", public");
response.addDateHeader("Expires", expires);
response.addDateHeader("Last-Modified", current);
不幸的是,这在服务器端不起作用(虽然它在我的web应用程序中起作用,该应用程序正在正确读取缓存的头信息,并重新使用其本地缓存)

当我试图从的管理面板查看Infinispan设置时,出现异常,无法继续


提前感谢您的帮助。

没有独立的Java servlet服务器能够以您预期的方式进行响应缓存。您在响应中设置的头将由浏览器(缓存)或中间代理(也可能缓存)解释。专门用于缓存的代理有:Varnish、NGINX。这些代理也称为边缘代理

如果创建一个库,使独立服务器能够像您希望的那样缓存,那么正常的请求流可能会被ServletFilter拦截。我不知道有哪个公共图书馆在做这样的事情

如果您想在应用程序内部缓存,通常要做的事情是使用缓存库,如,等等

在您的具体示例中,我建议您熟悉像NGINX这样的代理缓存服务器,并将其放在应用程序前面。比如说,这就是“行业标准”。不希望在Java服务器内执行HTTP响应缓存,原因有两个:

  • 在缓存命中的情况下,来自代理的响应更快,并且不会命中Java服务器
  • 通过在应用程序前面放置更多缓存代理,您可以进行扩展
  • Java堆不适合缓存大量数据。它应该去哪里?存在不会溢出到磁盘的缓存。这需要复杂的设置,以及应用程序前面的缓存代理
  • 为了调试和透明,最好在向服务器发送请求时,服务器生成一个新的答案
我总是建议在应用程序内部进行缓存。然而,我们是在Java对象级别上进行的。缓存大小有限,因此堆保持较小。应用程序中的许多缓存对象用于许多不同的响应,因此对象缓存比HTTP响应缓存更精细

只有在某些特殊情况下,我们也会在应用程序内部执行类似于HTTP响应缓存的操作。这用于压缩或重新压缩一些经常使用的图像和CSS资源。这里有一些潜力,是一个普遍有用的东西。也许我们会把这个开源

希望有帮助