如何在 java 中缓存 REST API 响应
How to cache REST API response in java
我正在 java.I 构建一个应用程序,循环点击 api 超过 15000 次并获得响应(响应仅是静态的)
例子
**
username in for loop
GET api.someapi/username
processing
end loop
**
完成所有通话需要几个小时。建议我以任何方式(任何缓存技术)减少调用时间。
P.S :
1) i am hitting api from java rest client(Spring resttemplate)
2) that api i am hitting is the public one, not developed by me
3) gonna deploy in heroku
尝试使用 Springs 缓存抽象,docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html。
您可以在调用 restTemplate 的方法中使用此抽象。
任何方法调用响应都可以使用此抽象进行缓存,方法参数作为键,return 类型作为响应。
@Cacheable("username")
public UserResponse getUser(String username){
// Code to call your rest api
}
这会围绕该方法创建一个 Spring AOP 建议。每次调用该方法时,它都会检查该键(用户名)的数据是否在缓存中可用,如果是,则 return 是缓存的响应,而不是调用实际方法。如果数据在缓存中不可用,那么它会调用实际的方法并将数据缓存在缓存中,因此下次使用相同的键调用相同的方法时,可以从缓存中选择数据。
这种缓存抽象可以由简单的 JVM 缓存(如 Guava)或更复杂的缓存实现(如 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);
希望对您有所帮助:)
我正在 java.I 构建一个应用程序,循环点击 api 超过 15000 次并获得响应(响应仅是静态的)
例子
**
username in for loop
GET api.someapi/username
processing
end loop
**
完成所有通话需要几个小时。建议我以任何方式(任何缓存技术)减少调用时间。
P.S :
1) i am hitting api from java rest client(Spring resttemplate)
2) that api i am hitting is the public one, not developed by me
3) gonna deploy in heroku
尝试使用 Springs 缓存抽象,docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html。
您可以在调用 restTemplate 的方法中使用此抽象。
任何方法调用响应都可以使用此抽象进行缓存,方法参数作为键,return 类型作为响应。
@Cacheable("username")
public UserResponse getUser(String username){
// Code to call your rest api
}
这会围绕该方法创建一个 Spring AOP 建议。每次调用该方法时,它都会检查该键(用户名)的数据是否在缓存中可用,如果是,则 return 是缓存的响应,而不是调用实际方法。如果数据在缓存中不可用,那么它会调用实际的方法并将数据缓存在缓存中,因此下次使用相同的键调用相同的方法时,可以从缓存中选择数据。
这种缓存抽象可以由简单的 JVM 缓存(如 Guava)或更复杂的缓存实现(如 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);
希望对您有所帮助:)