如何在java中缓存REST API响应

时间:2017-04-08 14:07:51

标签: spring rest caching rest-client spring-cache

我正在java中构建一个应用程序。我在循环中点击api超过15000次并获得响应(响应仅为静态)

实施例

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

完成所有通话需要数小时。建议我(任何缓存技术)减少通话时间。

P.S:

  

1)我正在从java rest客户端(Spring resttemplate)

中访问api      

2)我正在打击的是公开的,不是由我开发的

     

3)将在heroku中部署

2 个答案:

答案 0 :(得分:5)

尝试使用Springs Cache Abstraction,https://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建议。每次调用该方法时,它都会检查该密钥(用户名)的缓存中是否有数据,如果是,则返回缓存中的响应,而不调用实际方法。如果数据在高速缓存中不可用,则它调用实际方法并将数据缓存在高速缓存中,因此下次使用相同的密钥调用相同的方法时,可以从高速缓存中选择数据。

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

答案 1 :(得分:5)

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

我已经用这种方式(在存储库中)实现了我的解决方案(使用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);

我希望有帮助:)