web-dev-qa-db-fra.com

Comment mettre en cache REST Réponse de l'API dans java

Je suis en train de créer une application en Java, j'ai frappé l'API plus de 15 000 fois en boucle et j'obtiens la réponse (la réponse est statique uniquement)

Exemple

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

Il faut des heures pour terminer tous les appels. Suggérez-moi n'importe quel moyen (n'importe quelle technologie de cache) pour réduire le temps d'appel.

P.S:

1) Je frappe l'API de Java rest client (Spring resttemplate)

2) que l'api que je frappe est le public, non développé par moi

3) va se déployer dans Heroku

7
thaveethu gce

Essayez d'utiliser Springs Cache Abstraction, https://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html.

Vous pouvez utiliser cette abstraction dans la méthode qui a l'appel restTemplate.

Toute réponse d'appels de méthode peut être mise en cache à l'aide de cette abstraction, avec les paramètres de méthode comme clés et le type de retour comme réponse.

@Cacheable("username")
public UserResponse getUser(String username){
   // Code to call your rest api
}

Cela crée un conseil Spring AOP autour de la méthode. Chaque fois que la méthode est appelée, elle vérifie si les données sont disponibles dans le cache pour cette clé (nom d'utilisateur), si oui, renvoie la réponse du cache et n'appelle pas la méthode réelle. Si les données ne sont pas disponibles dans le cache, il appelle la méthode réelle et met en cache les données dans le cache.Ainsi, la prochaine fois que la même méthode sera appelée avec la même clé, les données pourront être extraites du cache.

Cette abstraction du cache peut être soutenue par de simples caches JVM comme Guava ou des implémentations de cache plus sophistiquées comme EHCache, Redis, HazelCast.

7
Praneeth Ramesh

Une note très importante à cette réponse: si vous prévoyez de mettre à jour ces valeurs (mises en cache), n'oubliez pas d'utiliser @CacheEvict sur save () et delete () dans les référentiels. Sinon, vous aurez des problèmes pour récupérer le nouvel enregistrement lors de sa mise à jour.

J'ai implémenté ma solution (avec EhCache) de cette façon (dans le référentiel):

CurrencyRepository.Java: // définir une instruction pouvant être mise en cache

@Cacheable("currencyByIdentifier")
public Currency findOneByIdentifier(String identifier);

CacheConfiguration.Java: // Définissez ce cache dans la configuration EhCache

@Bean
public JCacheManagerCustomizer cacheManagerCustomizer() {
    return cm -> {
        cm.createCache("currencyByIdentifier", jcacheConfiguration);
        cm.createCache("sourceSystemByIdentifier", jcacheConfiguration);
    };
}

CurrencyRepository.Java: // expulser lors de l'enregistrement et de la suppression en remplaçant la méthode par défaut

@Override
@CacheEvict("currencyByIdentifier")
<S extends Currency> S save(S currency);

@Override
@CacheEvict("currencyByIdentifier")
void delete(Currency currency);

J'espère que ça aide :)

7
dave0688