业务需求:一个线程写,N个线程读
为了提高在高并发情况下的查询效率, 应用在内存中维护了一份cache,cache内容需访问DB实时更新.
更新Cache,无非批量更新与增量更新这两种空间与时间的权衡。
增量更新过于复杂,这里采用了批量更新的方式。当然最重要的是要保证cache线程安全。最容易想到的方法是为cache加读写锁, 如果仅仅如此,性能会收到极大影响。
一段代码胜千言:{原来业务太复杂,算是伪码}
/**
* Created with IntelliJ IDEA. User: jianjun.yu Date: 14-8-12 Time: 下午2:08
*/
public class MemIndexManager {
private Lock guaranteeOneTimingTaskLock = new ReentrantLock();
private volatile Map<String, String> cache = Maps.newHashMap();
private void refreshCache() {
if (!guaranteeOneTimingTaskLock.tryLock()) {
return;
}
Map<String, String> cacheUseSwap = formDB();
cache = cacheUseSwap;
}
private String query(String key) {
return cache.get(key);
}
privat