我有一个用例,其中我配置了多个具有不同属性的缓存管理器,并用不同的方法命名了不同的缓存名称。 缓存的方法是从http客户端异步检索数据,然后缓存响应。在上述用例中,来自两个缓存方法的数据在返回结果之前进行合并。有时,结果仅包含来自一种缓存方法的数据,并且刷新后即可解决问题。 我无法理解在什么情况下会出现此问题?
@Configuraions
public class CacheConfig{
public static final String CACHE1 = "cache1";
public static final String CACHE2 = "cache2";
@Value("${cache.caffeineSpec:expireAfterWrite=43200s,maximumSize=1000,recordStats}")
private String cacheSpec1;
@Value("${cache.caffeineSpec: expireAfterWrite=3600s,maximumSize=2000,recordStats}")
private String cacheSpec2;
@Bean("cacheManager1")
@Primary
public CacheManager brokerDetailscacheManager() {
caffeineCacheManager cacheManager = new caffeineCacheManager(CACHE1);
cacheManager.setcaffeine(caffeine.from(cacheSpec1));
return cacheManager;
}
@Bean("cacheManager2")
public CacheManager brokerTierCodeMapCacheManager() {
caffeineCacheManager cacheManager = new caffeineCacheManager(CACHE2,BROKER_TIER_CACHE);
cacheManager.setcaffeine(caffeine.from(cacheSpec2));
return cacheManager;
}
}
使用中的模型
public class Person {
private String firstname;
private String lastname;
private List<Address> adresses;
}
private class Address {
private String street;
private String City
private String zip;
}
private class PersonInfo {
private String firstname;
private String lastname;
private Address address;
}
缓存的方法类为:
@Service
@RequiredArgsConstructor
public class PersonCache {
private final DataClient dataClient;
@Cacheable(cacheNames = CacheConfig.CACHE1,cacheManager = "cacheManager1",sync = true)
public Map<String,Person> getPersonDetails(String firstname) {
Map<String,Person> personmap = new HashMap()<>;
//Key is first name,grouping all results by firstname
try {
personmap = dataClient.getPersonDetails(firstname)
.toCompletableFuture()
.get(3,TimeUnit.SECONDS);
}catch(Exception e) {
log.error("Error fetching response from api". e);
}
}
@Cacheable(cacheNames = CacheConfig.CACHE2,cacheManager = "cacheManager2",Person> getPersonDetails(String firstname) {
List<PersonInfo> personmap = new ArrayList();
try {
personmap = dataClient.getPersonInfoDetails(firstname)
.toCompletableFuture()
.get(3,TimeUnit.SECONDS);
}catch(Exception e) {
log.error("Error fetching response from api". e);
}
return transformPersonInfoToPerson(personmap);
}
}
调用方法:
@Service
@RequiredArgsConstructor
public class PersonService {
private final PersonCache personCache;
public List<Person> getPersonDetails(String firstName) {
Map<String,Person> personResponse1 = personCache.getPersonDetails(firstName);
//.. after fetching for the first result set,check for a flag and call the below cache to append the data
Map<String,Person> personResponse2 = personCache.getPersonInfoDetails(firstName);
personResponse1.putAll(personResponse2);
// This when returned at times does not contain any response from personResponse1 and only contains the personResponse2 data
return personResponse1.values();
}
}
异步API调用是否可能导致某种遗漏,并将第二个缓存的结果集添加到结果中并返回? (调用方法也从控制器类异步调用)
无论端点被触发的次数如何,我应如何处理以获得一致的响应?