2017-04-08 26 views
3

我建立在java.I应用程序打API超过环路15000次,得到的回应(回应是静态的唯一)如何缓存在Java的REST API响应

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

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

PS:

1)我打从Java REST客户端API(春季resttemplate)

2)API我打的是公共的,而不是由我

开发3)将部署在英雄

+0

缓存系统需要的内存资源。尤其是如果api频繁调用。实际上你的情况还不够清楚。如果响应是相同的,你为什么要调用api 15000次?为什么你决定这样做?我认为解决方案不正确,请描述你的情况,我们会尝试提供解决方案。 – Sarkhan

回答

5

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

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

3

对此答案的一个非常重要的注意事项:如果您计划更新这些(缓存)值,请不要忘记在存储库的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); 

删除我希望帮助:)