使用技术:
1.MQ
2.LinkedHashMap(后来使用caffeine)
设计问题:
1.先删除缓存还是先落数据库(使用先入库后删除,入库后发送MQ消息通知其他机器删除,存在缓存和数据库不一致的情况——可容忍)
2.两个线程同时更新缓存的先后问题
关键实现
private static HashMap cache = new LinkedHashMap(); // 非线程安全
private Lock lock = new ReentryLock();//锁
private synchronized void update(String key ,Object value){ //线程不安全 加锁
cache.put(key,value);
}
// 查询缓存没有锁,更新缓存解决因为多线程执行顺序导致缓存脏数据问题
public Object getCache(String key){
if(cache.contains(key)){
return cache.get(key);
}else{
try{
// 如果已经被别的线程占用了锁,那么在这里循环查看是否已经被放到缓存中
while(!lock.tryLock()){
if(cache.contains(key)){
return cache.get(key);
}
}
//查询数据库
Object value=SqlQuery("xxxxxxxxx?",key);
//update是加锁操作。
update(key,value);
}finally{
//释放锁
lock.lock();
}
}
}
// 使用MQ来进行广播,不同机器删除本地缓存
public void delete(){
cache.remove(key);
}
```