多请求在执行过程中破坏同一类实例



我有一个类作为缓存,它使用Map(HashMap或ConcurrentHashMap(,我想在执行每个新的(http(请求之前清除我的Map,例如

@Component
public Class MyCache {
Map cache = new ConcurrentHashMap();

get(key) {
cache.computeIfAbsent(key, fetchFromDB())
}
clearCache() {
cache.clear()
}
}
@Controller
public Class MyController {
@Autowired
MyCache myCache

@Get
Response getInfo(ids) {
// give me a fresh cache at beginning of every new request
myCache.clearCache()
// load and fetch from myCache of current request
ids.foreach(id -> {
myCache.get(id)
})
}
}

以上代码思想是针对

  • 在收到新请求时初始重置缓存
  • 然后对于输入的所有id(可能是数百(,从缓存中提取
  • 若相同的id已经存储在缓存中,我们就不需要重新调用fetchFromDB

所有东西都可以在本地使用单个线程,但当使用2个或多个线程调用时,在执行thread1的过程中,thread2可能会启动并调用myCache.clearCache(),不知何故,我的thread1突然在myCache中找不到任何存储在其所有已处理项中的内容。

  • 原因是我的映射在类中是singleton(例如MyCache、Controller(,而即使每个请求都处理自己的线程,它们也会在同一个实例上执行操作
  • 如果我仍然想为每个请求获得一个干净的缓存,那么解决这个问题的最佳方法是什么?无论如何,我可以检测到在我当前线程clearCache((之前是否还有其他线程仍在执行

我通过以下方式解决了这个问题:Google Guava Cache如何使用并发哈希映射和重入锁作为分段

最新更新