gpt4 book ai didi

java - 服务器端缓存

转载 作者:行者123 更新时间:2023-12-02 04:04:08 24 4
gpt4 key购买 nike

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

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

我从文档中不明白如何执行此操作。您能给我指点实现此功能的教程或手册吗?

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

然后,我修改了响应对象以包含在 header 信息中进行缓存,希望它能像 JAX-RS 一样工作,检查 header 并自动缓存。

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);

不幸的是,这在服务器端不起作用(认为它确实适用于我的网络应用程序,该应用程序正在正确读取缓存的 header 信息并重新使用其本地缓存)。

当我尝试从管理面板 http://127.0.0.1:9990 查看 Infinispan 设置时,我遇到异常,无法继续。

预先感谢您的帮助。

最佳答案

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

制作一个库,使独立服务器能够像您想要的那样进行缓存,可能存在接缝,正常的请求流可以被 ServletFilter 拦截。我不知道有哪个公共(public)图书馆在做这样的事情。

如果你想在应用程序内部进行缓存,通常的做法是使用缓存库,例如 EHCache , cache2k , Google Guava Cache以及其他。

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

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

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

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

希望有帮助。

关于java - 服务器端缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34542944/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com