4 回答
TA贡献2019条经验 获得超9个赞
显然关于你的问题的所有评论都是正确的。你应该使用 CacheEvict。我在这里找到了解决方案:https ://www.baeldung.com/spring-boot-evict-cache ,它看起来像这样:
您所要做的就是创建名为例如 CacheService 的类,并创建将驱逐您拥有的所有缓存对象的方法。然后你注释该方法 @Scheduled 并输入你的间隔率。
@Service
public class CacheService {
@Autowired
CacheManager cacheManager;
public void evictAllCaches() {
cacheManager.getCacheNames().stream()
.forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}
@Scheduled(fixedRate = 6000)
public void evictAllcachesAtIntervals() {
evictAllCaches();
}
}
TA贡献1827条经验 获得超8个赞
许多人建议使用的选项@CacheEvict是正确的。此外,为确保您的缓存(近)始终加载最新数据,即使数据库中的数据更新超出了您正在运行的应用程序的范围,您也需要定期重新加载整个数据集,间隔时间与您应用程序的 SLA 相匹配。在上面建议的解决方案中,添加逻辑以重新加载所有数据,如下所示:
@Service
public class CacheService {
@Autowired
CacheManager cacheManager;
public void refreshAllCaches() {
cacheManager.getCacheNames().stream()
.forEach(cacheName -> cacheManager.getCache(cacheName).clear());
// reload whole dataset here, dummy example here:
dataRepository.findAll().forEach(a -> cacheManager.getCache("cache-name")).put(a.getKey(), a));
}
@Scheduled(fixedRate = 6000)
public void refreshAllcachesAtIntervals() {
refreshAllCaches();
}
}
TA贡献1946条经验 获得超3个赞
尝试这样的事情,正如评论中提到的那样:
@Caching(evict={@CacheEvict(value="partTypeCache", key="#partKey")})
public boolean deletePartType(String partKey) {
//when this method is invoked the cache is evicted for the requested key
}
TA贡献1845条经验 获得超8个赞
除了上述答案外,您还可以在调度程序中使用 cron,这样可以提供更大的灵活性。您可以让调度程序每天、每周、每年、每天中午 12 点等运行,而无需编写大量代码。
@Service 公共类 CacheService {
@Autowired
CacheManager cacheManager;
public void evictAllCaches() {
cacheManager.getCacheNames().stream()
.forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}
@Scheduled(cron = "@weekly")
public void evictAllcachesAtIntervals() {
evictAllCaches();
}
}
添加回答
举报