【问题标题】:How to cache results of requests in Tomcat 7?如何在 Tomcat 7 中缓存请求的结果?
【发布时间】:2015-11-10 14:01:06
【问题描述】:

我的 Web 应用程序中有一些路由需要缓存其结果。

示例:domain.com/client/1

这条路线在我的数据库中进行一些查询,生成 1~2mb 的 JSON。我想缓存这条路线的结果。但我也想在一分钟内过期。如何做到这一点最好?

【问题讨论】:

  • 设置一个60秒的http缓存头。或者创建一个为所有客户端缓存的服务器端缓存。
  • 你想要服务器端缓存吗?

标签: tomcat tomcat7 jax-rs cdi


【解决方案1】:

对于服务器端缓存,您可以查看JCACHE (JSR 107)。

EhcacheInfinispan 等缓存解决方案实现了JSR 107

无限

例如,使用 Infinispan,您可以为缓存条目设置生命周期:

Configuration configuration = new ConfigurationBuilder()
                                      .expiration()
                                      .lifespan(60, TimeUnit.SECONDS)
                                      .build();

Cache<Object, Object> cache = new DefaultCacheManager(configuration).getCache();
cache.put("key", "value");
cache.remove("key");

要使用 Infinispan,只需在您的 pom.xml 添加以下依赖项:

<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-embedded</artifactId>
    <version>8.0.1.Final</version>
</dependency>

如果您不使用 Maven,请从 Infinispan download page 下载。

番石榴

你也可以看看cache API provided by Guava

Cache<Object, Object> cache = CacheBuilder.newBuilder()
                                  .expireAfterWrite(60, TimeUnit.SECONDS)
                                  .build();

cache.put("key", "value");
cache.invalidate("key");

要使用它,请将以下依赖项添加到您的pom.xml

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

【讨论】:

  • 哈哈,他们网站上的 infinispan-minimal zip 是 26MB!如果我的项目使用的是番石榴,我会使用 caffeineguava cache。此外,如果 OP 要在堆中缓存大量如此巨大的对象,则会严重损害 GC
  • 这是一个很好的观察,但问题不是很具体的要求。
猜你喜欢
  • 1970-01-01
  • 2015-01-06
  • 2018-04-17
  • 2016-03-04
  • 2021-11-12
  • 2021-10-04
  • 2019-11-08
  • 1970-01-01
  • 2011-04-08
相关资源
最近更新 更多