服务器端缓存

时间:2015-12-31 07:40:37

标签: java caching wildfly wildfly-9

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

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

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

我使用独立\ configuration \ standalone.xml

中的Infispan默认配置启动了wildfly

然后,我修改了响应对象以包含缓存的头信息,希望它能像JAX-RS那样检查标头并自动缓存。

init_foo

遗憾的是,它在服务器端无效(认为它适用于我的Web应用程序,它正确读取缓存的标头信息并重新使用其本地缓存)。

当我尝试在http://127.0.0.1:9990的管理面板中查看Infinispan设置时,出现异常但无法继续。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

没有独立的Java servlet服务器以您预期的方式执行响应缓存。您在响应中设置的标头将由浏览器(确实缓存)或中间代理解释,这些代理也可以缓存。缓存的专业代理是:Varnish,NGINX。这些代理也称为Edge Proxies。

制作一个库,使独立服务器能够像你想要的那样进行缓存,接缝可能,ServletFilter可以拦截正常的请求流。我不知道有任何类似的公共图书馆。

如果要在应用程序内部进行缓存,通常要使用缓存库,如EHCachecache2kGoogle Guava Cache等。

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

  • 如果缓存命中,代理的响应速度更快,而Java服务器未命中
  • 您可以通过在应用程序前添加更多缓存代理来扩展。
  • Java堆不适合缓存大量数据。它应该去哪里?有些缓存会溢出到磁盘。这需要复杂的设置,以及应用程序前面的缓存代理
  • 对于调试和透明度,服务器最好在向其发送请求时生成新的答案

我也建议在应用程序内部进行缓存。但是我们在Java对象级别上执行此操作。缓存大小有限,因此堆保持较小。应用程序内部的许多缓存对象用于许多不同的响应,因此对象缓存比HTTP响应缓存更精细。

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

希望有所帮助。