分别考虑以下两种方法,写的伪代码,即取一个复杂的数据结构,并进行更新,:如何使用内存高速缓存的并发性关键的上下文
getData(id) {
if(isInCache(id)) return getFromCache(id) // already in cache?
data = fetchComplexDataStructureFromDatabase(id) // time consuming!
setCache(id, data) // update cache
return data
}
updateData(id, data) {
storeDataStructureInDatabase(id, data)
clearCache(id)
}
在上面的实施,并发性方面存在问题,并且我们最终可能会在高速缓存中产生过时的数据:请考虑分别运行getData()
和updateData()
的两个并行执行。如果第一次执行从另一个执行的storeDataStructureInDatabase()
和clearCache()
之间的调用中正好从缓存中提取数据,那么我们将获得过时的数据版本。你如何解决这个并发问题?再次
storeDataStructureInDatabase(id, data) {
executeSql("UPDATE table1 SET...")
executeSql("UPDATE table2 SET...")
executeSql("UPDATE table3 SET...")
clearCache(id)
executeSql("COMMIT")
}
但后来:
我考虑了以下解决方案,其中高速缓存仅仅是数据被提交之前无效如果一个执行读取其他执行的通话之间的高速缓存clearCache()
和COMMIT
,然后过时的数据将被提取到缓存中。问题没有解决。
一个令人印象深刻和复杂的答案!谢谢! – someName 2011-06-15 14:01:29