Spring Boot Caching使用@PostConstruct自动刷新



我目前有一个基于Spring Boot的应用程序,其中没有活动缓存。我们的应用程序严重依赖于我们在Oracle数据库中维护的键值配置。目前,没有缓存,每次我想从表中获取任何值,它是一个数据库调用。由于对DB的事务数量很多,这可能会导致大量的开销。因此,需要缓存。

在搜索SpringBoot的缓存解决方案时,我主要发现我们缓存对象的链接,而任何CRUD操作都是通过应用程序代码本身执行的,使用注释如@Cacheable,@CachePut,@CacheEvict等,但这不适用于我。我在DB中有一个键值对的主数据,任何更改都需要批准,因此访问不直接提供给用户,它是一旦在DB中直接批准。

我想让这些键值在启动时加载并保存在内存中,所以我尝试使用@PostConstructConcurrentHashMap类实现相同的功能,如下所示:

public ConcurrentHashMap<String, String> cacheMap = new ConcurrentHashMap<>();
@PostConstruct
public void initialiseCacheMap() {
List<MyEntity> list = myRepository.findAll();
for(int i = 0; i < list.size(); i++) {
cacheMap.put(list.get(i).getKey(), list.get(i).getValue());
}   
}

在我的service类中,每当我想要得到某样东西时,我首先检查数据是否在地图中可用,如果没有,我检查DB。

我的目标正在实现,我能够大大提高应用程序的性能。之前的一组事务需要6.28秒才能完成,现在只需562毫秒就完成了!但是,有一个问题我没有弄明白:

@PostConstruct被Spring调用一次,在启动时,在依赖注入后。这意味着,我没有办法在不重启或应用程序停机的情况下重新触发缓存构建,不幸的是,这是不可接受的。此外,截至目前,我没有自由使用任何现有的缓存框架或库,如ehcacheRedis

我如何实现这个缓存的定期刷新(让我们说每30分钟?),只有普通的旧Java/Spring类/库?

提前感谢任何想法!

您可以通过几种方式实现这一点,但您也可以通过以下方式实现:


private const val everyThrityMinute = "0 0/30 * * * ?"
@Component
class TheAmazingPreloader {
@Scheduled(cron = everyThrityMinute)
@EventListener(ApplicationReadyEvent::class)
fun refreshCachedEntries() {
// the preloading happens here
}
}

当应用程序启动时,你有预加载位,也有刷新机制,比如每30分钟触发一次。

您将需要在某些@Configuration-class或@SpringBootApplication-class上添加注释:

@EnableScheduling

最新更新