java中的缓存问题,求教各位

刚开始工作,听同事说项目中用到了缓存技术,但是对缓存的知识不是很了解,希望大家帮助

可以看一下这篇文章 http://blog.sina.com.cn/s/blog_6aefe42501018wnn.html

就是把数据库中查询出来的数据放到变量中,以减少与数据库的交互

  1. 首先. 缓存简单说就是以空间换取时间的手段。这里的空间是指内存空间,而时间则指程序的运行时间。 比如从数据库中获取用户基本信息,如果每次都访问DB,那么程序代码需要等待DB的响应,如果本地有一个map,其中就存储了用户的基本信息,那么直接从map中获取,是否就提高了效率了呢?当然,这个本地的map只是一种本地缓存的简单例子。实际应用中,可以有本地缓存,远端缓存(比如利用memcache,这是一个用C实现按的开源缓存服务)。 2 .用了缓存,除了牺牲了内存空间之外,还要解决缓存同步的问题。比如前面的例子,用户基本信息可能会被更改,要确保缓存中的数据是最新的,而不是脏的旧数据,就需要在数据更新时对缓存进行同步更改,或者将缓存失效。

缓存,相当于水池,用于数据过渡

直接上代码,希望能对你有帮助:
/**
* 自定义缓存
* 获取源数据时只能一个线程进行
* 从缓存中获取时允许并发
*
*/

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;  
    }  
}