4 回答

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
顯然關(guān)于你的問(wèn)題的所有評(píng)論都是正確的。你應(yīng)該使用 CacheEvict。我在這里找到了解決方案:https ://www.baeldung.com/spring-boot-evict-cache ,它看起來(lái)像這樣:
您所要做的就是創(chuàng)建名為例如 CacheService 的類,并創(chuàng)建將驅(qū)逐您擁有的所有緩存對(duì)象的方法。然后你注釋該方法 @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貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
許多人建議使用的選項(xiàng)@CacheEvict是正確的。此外,為確保您的緩存(近)始終加載最新數(shù)據(jù),即使數(shù)據(jù)庫(kù)中的數(shù)據(jù)更新超出了您正在運(yùn)行的應(yīng)用程序的范圍,您也需要定期重新加載整個(gè)數(shù)據(jù)集,間隔時(shí)間與您應(yīng)用程序的 SLA 相匹配。在上面建議的解決方案中,添加邏輯以重新加載所有數(shù)據(jù),如下所示:
@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貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
嘗試這樣的事情,正如評(píng)論中提到的那樣:
@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貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
除了上述答案外,您還可以在調(diào)度程序中使用 cron,這樣可以提供更大的靈活性。您可以讓調(diào)度程序每天、每周、每年、每天中午 12 點(diǎn)等運(yùn)行,而無(wú)需編寫(xiě)大量代碼。
@Service 公共類 CacheService {
@Autowired
CacheManager cacheManager;
public void evictAllCaches() {
cacheManager.getCacheNames().stream()
.forEach(cacheName -> cacheManager.getCache(cacheName).clear());
}
@Scheduled(cron = "@weekly")
public void evictAllcachesAtIntervals() {
evictAllCaches();
}
}
添加回答
舉報(bào)