如何在Java中缓存REST API响应

12

我正在使用Java构建一个应用程序。在循环中,我调用API超过15000次并获得响应(响应仅为静态内容)。

示例

**
  username in for loop   
  GET api.someapi/username
  processing
  end loop
**

完成所有电话需要几个小时。建议我采用任何方式(任何缓存技术)来减少通话时间。

P.S :

1)我正在通过Java Rest客户端(Spring RestTemplate)调用API

2)我正在调用的API是公共的,不是由我开发的

3)将要在Heroku上部署


1
缓存系统需要内存资源,特别是在API频繁调用的情况下。实际上,您的情况不够清楚。如果响应相同,为什么要调用API 15000次?为什么要这样决定?我认为解决方案不正确,因此请描述您的情况,我们将尝试提供解决方案。 - Sarkhan
2个回答

12

对于这个答案有一个非常重要的注意事项:如果您计划更新那些(缓存的)值,请不要忘记在仓库的save()和delete()上使用@CacheEvict。否则,当记录被更新时,您将无法获取新记录。

我已经用EhCache实现了我的解决方案(在仓库中):

CurrencyRepository.java: // 定义一个可缓存的语句

@Cacheable("currencyByIdentifier")
public Currency findOneByIdentifier(String identifier);

CacheConfiguration.java://在EhCache配置中定义缓存

@Bean
public JCacheManagerCustomizer cacheManagerCustomizer() {
    return cm -> {
        cm.createCache("currencyByIdentifier", jcacheConfiguration);
        cm.createCache("sourceSystemByIdentifier", jcacheConfiguration);
    };
}

CurrencyRepository.java: // 通过覆盖默认方法,在保存和删除时进行逐出

@Override
@CacheEvict("currencyByIdentifier")
<S extends Currency> S save(S currency);

@Override
@CacheEvict("currencyByIdentifier")
void delete(Currency currency);

我希望这有所帮助 :)


12

尝试使用 Spring 的缓存抽象层,docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html

您可以在具有 restTemplate 调用的方法中使用此抽象层。

使用此抽象层可以缓存任何方法调用的响应,方法参数作为键,返回类型作为响应。

@Cacheable("username")
public UserResponse getUser(String username){
   // Code to call your rest api
}

这将创建一个Spring AOP方法的通知。每次调用该方法时,它都会检查是否在此键(用户名)的缓存中可用数据,如果是,则返回来自缓存而不是实际方法的响应。如果缓存中没有可用的数据,则调用实际方法并将数据缓存在缓存中,因此下一次使用相同键调用相同方法时,数据可以从缓存中获取。

这个缓存抽象可以由简单的JVM缓存(如Guava)或更复杂的缓存实现(如EHCache,Redis,HazelCast等)支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接