2017-04-08 30 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); 

刪除我希望幫助:)