私はJavaでアプリを構築しています。ループで15000回を超えてapiをヒットし、応答を取得します(応答は静的のみです)
例
**
username in for loop
GET api.someapi/username
processing
end loop
**
すべての通話が完了するまで数時間かかります。呼び出し時間を短縮する方法(キャッシュ技術)を教えてください。
PS:
1)私はJava RESTクライアント(Spring RestTemplate)
2)私がヒットしているapiは私が開発したものではなく、公開されているものです
3)herokuにデプロイする
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などのより高度なキャッシュ実装によってサポートされます。
その答えに対する非常に重要な注意:これらの(キャッシュされた)値を更新する予定がある場合は、リポジトリの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);
それが役に立てば幸いです:)