利用读写锁,完成缓存数据读写,减少db压力。
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteCache {
// 锁
private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
private Map<String, Object> cache = new HashMap<>();
public Object getData(String key) {
// 获取读锁
reentrantReadWriteLock.readLock().lock();
try {
Object result = cache.get(key);
if (result != null) {
return result;
}
// 释放读锁
reentrantReadWriteLock.readLock().unlock();
// 获取写锁
reentrantReadWriteLock.writeLock().lock();
try {
if (cache.get(key) != null) {
System.out.println("get from cache:" + key);
return cache.get(key);
}
result = getFromDb(key);
cache.put(key, result);
return result;
} finally {
// 获取读锁,进行锁降级
reentrantReadWriteLock.readLock().lock();
// 释放写锁
reentrantReadWriteLock.writeLock().unlock();
}
} finally {
// 释放读锁
reentrantReadWriteLock.readLock().unlock();
}
}
public Object getFromDb(String key) {
return System.currentTimeMillis() + "_" + key;
}
public static void main(String[] args) {
ReadWriteCache readWriteCache = new ReadWriteCache();
Object result = readWriteCache.getData("a");
System.out.println(result);
result = readWriteCache.getData("a");
System.out.println(result);
result = readWriteCache.getData("b");
System.out.println(result);
result = readWriteCache.getData("b");
System.out.println(result);
}
}