web-dev-qa-db-ja.com

キャッシュの方法REST APIレスポンスjava

私はJavaでアプリを構築しています。ループで15000回を超えてapiをヒットし、応答を取得します(応答は静的のみです)

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

すべての通話が完了するまで数時間かかります。呼び出し時間を短縮する方法(キャッシュ技術)を教えてください。

PS:

1)私はJava RESTクライアント(Spring RestTemplate)

2)私がヒットしているapiは私が開発したものではなく、公開されているものです

3)herokuにデプロイする

7
thaveethu gce

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などのより高度なキャッシュ実装によってサポートされます。

7
Praneeth Ramesh

その答えに対する非常に重要な注意:これらの(キャッシュされた)値を更新する予定がある場合は、リポジトリの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);

それが役に立てば幸いです:)

7
dave0688