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();
}
}
添加回答
舉報