刚开始工作,听同事说项目中用到了缓存技术,但是对缓存的知识不是很了解,希望大家帮助
可以看一下这篇文章 http://blog.sina.com.cn/s/blog_6aefe42501018wnn.html
就是把数据库中查询出来的数据放到变量中,以减少与数据库的交互
缓存,相当于水池,用于数据过渡
直接上代码,希望能对你有帮助:
/**
* 自定义缓存
* 获取源数据时只能一个线程进行
* 从缓存中获取时允许并发
*
*/
class MyCache {
// 缓存map
private Map<String, Object> myCache = new HashMap<String, Object>();
// 读写锁
private ReadWriteLock rwLock = new ReentrantReadWriteLock();
// 获取数据,这里允许多人同时获取,但在写时只能一个人操作
public Object getData(String key) {
rwLock.readLock().lock(); // 上读锁,允许多人读,但此时不允许写
Object value = null;
try {
value = myCache.get(key);
// 若缓存中没有数据,就从数据库或其他地方获取,并加入缓存
// 但此时释放读锁,加写锁,保证只有一个人能操作且只操作一次
if (null == value) {
rwLock.readLock().unlock();// 释放读锁
rwLock.writeLock().lock();// 加写锁
try {
if (null == value) { // 这里再判断一次是防止其他线程也走到这一步再次获取
value = ""; // 从其他地方获取
}
} finally {
rwLock.writeLock().unlock();// 获取了数据之后,释放写锁,再加读锁
}
}
} finally {
rwLock.readLock().unlock();// 释放读锁
}
return value;
}
}
直接上代码,希望能对你有帮助:
/**
* 自定义缓存
* 获取源数据时只能一个线程进行
* 从缓存中获取时允许并发
*
*/
class MyCache {
// 缓存map
private Map<String, Object> myCache = new HashMap<String, Object>();
// 读写锁
private ReadWriteLock rwLock = new ReentrantReadWriteLock();
// 获取数据,这里允许多人同时获取,但在写时只能一个人操作
public Object getData(String key) {
rwLock.readLock().lock(); // 上读锁,允许多人读,但此时不允许写
Object value = null;
try {
value = myCache.get(key);
// 若缓存中没有数据,就从数据库或其他地方获取,并加入缓存
// 但此时释放读锁,加写锁,保证只有一个人能操作且只操作一次
if (null == value) {
rwLock.readLock().unlock();// 释放读锁
rwLock.writeLock().lock();// 加写锁
try {
if (null == value) { // 这里再判断一次是防止其他线程也走到这一步再次获取
value = ""; // 从其他地方获取
}
} finally {
rwLock.writeLock().unlock();// 获取了数据之后,释放写锁,再加读锁
}
}
} finally {
rwLock.readLock().unlock();// 释放读锁
}
return value;
}
}