春季每次服务调用后刷新缓存



我在DAO层中有一个实现,比如:

@Cacheable(value = "features", cacheManager = "springCacheManager")
public List<Feature> getFeaturesFromProjectByRelease(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) {
//lets return a valid list with some random data, for simplicity I have returned a blank one here
return new ArrayList<Feature>();
}

我有这样的服务:

//Get all the features for projects and release
List<Feature> featureList = featureDao.getFeaturesFromProjectByRelease(userDto, projectId, releaseId, releasesList);
try {
this.refreshFeatureListCache(userDto, projectId, releaseId, releasesList);
} catch (InterruptedException e) {
logger.error("Cannot refresh 'features' cache");
e.printStackTrace();
}
@Async("asyncExecutor")
public CompletableFuture<List<Feature>> refreshFeatureListCache(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) throws InterruptedException {
return this.updateFeatureListInCache(userDto, projectId, releaseId, releasesList);
}
@CachePut(value = "features", cacheManager = "springCacheManager")
private CompletableFuture<List<Feature>> updateFeatureListInCache(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) {
List<Feature> featureList = featureDao.getFeaturesFromProjectByRelease(userDto, projectId, releaseId, releasesList);
return CompletableFuture.completedFuture(featureList);
}

我有一个执行器服务"asyncExecutor"也在运行。

我不太确定以上是否可行。

如果这不起作用,我正在寻找一个替代解决方案,我将从缓存中读取"featureList"(如果可用(,然后立即调用另一个ASYNCHRONOUSLY服务,该服务将通过实际访问数据库来更新/刷新缓存。任何关于这方面的建议都将有所帮助!

编辑:添加问题陈述以更好地澄清挑战:

  1. 从数据库中获取数据。如果是第一次发出请求,则调用实际服务并缓存数据
  2. 如果是第二次请求,请从缓存中检索数据,以避免前端用户等待时间过长。一旦从缓存中提供请求,立即再次调用该服务,并通过实际调用耗时服务方法ASYNCHRONOUSLY来更新/刷新缓存数据,这样用户就不必等待冻结/加载状态UI

我不知道这是否可行,但如果不行,你可以手动清除缓存,然后再次调用缓存方法,比如:

public class ExampleService {
private final CacheManager cacheManager;
private final FeatureDAO featureDao;
public ExampleService(CacheManager cacheManager, FeatureDAO featureDao) {
this.cacheManager = cacheManager;
this.featureDao = featureDao;
}
@Cacheable(value = "features", cacheManager = "springCacheManager")
public List<Feature> getFeaturesFromProjectByRelease(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) {
//lets return a valid list with some random data, for simplicity I have returned a blank one here
return new ArrayList<Feature>();
}
@Async("asyncExecutor")
public CompletableFuture<List<Feature>> refreshFeatureListCache(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) throws InterruptedException {
return this.updateFeatureListInCache(userDto, projectId, releaseId, releasesList);
}
private CompletableFuture<List<Feature>> updateFeatureListInCache(UserDto userDto, int projectId, int releaseId, List<Integer> releasesList) {
Cache featuresCache = cacheManager.getCache("features");
featuresCache.clear();
List<Feature> featureList = featureDao.getFeaturesFromProjectByRelease(userDto, projectId, releaseId, releasesList);
return CompletableFuture.completedFuture(featureList);
}
}

最新更新