在 spring boot 中重新加载/刷新缓存

我正在使用 Spring Boot 并使用 Ehcache 进行缓存。到目前为止一切正常。但是现在我必须重新加载/刷新,所以我该怎么做才能使我的应用程序不会有任何停机时间。


我在 Spring Ehcache 中尝试了很多方法,但它没有用,否则必须编写调度程序并重新加载数据。


@Override

@Cacheable(value="partTypeCache", key="#partKey")

public List<PartType> loadPartType(String partKey) throws CustomException {

        return productIdentityDao.loadPartType();

}


开满天机
浏览 343回答 4
4回答

慕少森

显然关于你的问题的所有评论都是正确的。你应该使用 CacheEvict。我在这里找到了解决方案:https ://www.baeldung.com/spring-boot-evict-cache ,它看起来像这样:您所要做的就是创建名为例如 CacheService 的类,并创建将驱逐您拥有的所有缓存对象的方法。然后你注释该方法 @Scheduled 并输入你的间隔率。@Servicepublic class CacheService {&nbsp; &nbsp; @Autowired&nbsp; &nbsp; CacheManager cacheManager;&nbsp; &nbsp; public void evictAllCaches() {&nbsp; &nbsp; &nbsp; &nbsp; cacheManager.getCacheNames().stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .forEach(cacheName -> cacheManager.getCache(cacheName).clear());&nbsp; &nbsp; }&nbsp; &nbsp; @Scheduled(fixedRate = 6000)&nbsp; &nbsp; public void evictAllcachesAtIntervals() {&nbsp; &nbsp; &nbsp; &nbsp; evictAllCaches();&nbsp; &nbsp; }}

慕仙森

许多人建议使用的选项@CacheEvict是正确的。此外,为确保您的缓存(近)始终加载最新数据,即使数据库中的数据更新超出了您正在运行的应用程序的范围,您也需要定期重新加载整个数据集,间隔时间与您应用程序的 SLA 相匹配。在上面建议的解决方案中,添加逻辑以重新加载所有数据,如下所示:@Servicepublic class CacheService {&nbsp; &nbsp; @Autowired&nbsp; &nbsp; CacheManager cacheManager;&nbsp; &nbsp; public void refreshAllCaches() {&nbsp; &nbsp; &nbsp; &nbsp; cacheManager.getCacheNames().stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .forEach(cacheName -> cacheManager.getCache(cacheName).clear());&nbsp; &nbsp; &nbsp; &nbsp; // reload whole dataset here, dummy example here:&nbsp; &nbsp; &nbsp; &nbsp; dataRepository.findAll().forEach(a -> cacheManager.getCache("cache-name")).put(a.getKey(), a));&nbsp; &nbsp; }&nbsp; &nbsp; @Scheduled(fixedRate = 6000)&nbsp; &nbsp; public void refreshAllcachesAtIntervals() {&nbsp; &nbsp; &nbsp; &nbsp; refreshAllCaches();&nbsp; &nbsp; }}

智慧大石

尝试这样的事情,正如评论中提到的那样:&nbsp; &nbsp; @Caching(evict={@CacheEvict(value="partTypeCache", key="#partKey")})&nbsp; &nbsp; public boolean deletePartType(String partKey) {&nbsp;&nbsp; &nbsp; &nbsp; //when this method is invoked the cache is evicted for the requested key&nbsp; &nbsp; }

精慕HU

除了上述答案外,您还可以在调度程序中使用 cron,这样可以提供更大的灵活性。您可以让调度程序每天、每周、每年、每天中午 12 点等运行,而无需编写大量代码。@Service 公共类 CacheService {@AutowiredCacheManager cacheManager;public void evictAllCaches() {&nbsp; &nbsp; cacheManager.getCacheNames().stream()&nbsp; &nbsp; &nbsp; .forEach(cacheName -> cacheManager.getCache(cacheName).clear());}@Scheduled(cron = "@weekly")public void evictAllcachesAtIntervals() {&nbsp; &nbsp; evictAllCaches();}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java