我在springboot中有一个端点,它删除并加载缓存。当它在几分之一秒内被调用时,缓存正在加载双倍的数据量?

问题描述 投票:0回答:1

我有一个 SpringBoot 应用程序。我有一个端点,它删除缓存并在给定日期的给定表的应用程序中重新加载缓存。

@PostMapping("/endpoint")
public boolean reloadCache(@RequestBody Map<String, String> requestbody){
String table = requestbody.get("table");
String date = requestbody.get("date");
return reloadCacheService.reloadCache(table, date);
}

我在 ReloadCacheService 中有以下代码:

public boolean reloadCache(String table, String date){
LocalDate localDate = Util.methodToConvertStringToLocalDate(date);
deleteCache(table, date);
loadCache(table, date);
return true;
}

因此,每当我在几秒钟内针对同一个表和同一日期两次访问端点时,我就会在缓存中获得双倍的原始数据量。发生这种情况是因为首先同时发生deleteCache,然后发生loadCache。如果我只到达一个端点,那么它就会按预期工作。处理这个问题的最佳方法是什么?

我正在寻找多线程方式或异步方式来处理这个问题。我没有做出任何修复,因为在生产中我们不可能在几秒钟内到达具有相同日期和表的端点。但是,我想知道一种有效的方法来处理这个问题。

java spring-boot multithreading spring-mvc asynchronous
1个回答
0
投票

您似乎有竞争状况。当两个请求并行出现时,两个请求很可能同时经过相同的代码区域,因此两个请求很可能同时加载。如果缓存是单例的,那么它将有双倍的数据。这完全取决于您如何实现方法。

您需要添加一些多线程处理,很可能一个简单的锁就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.