
Java中可以使用队列来保存数据,当使用的时候,加上锁,防止其他进程访问,当不用的时候保存到数据库里面,示例如下:
package com.henryimport java.util.HashMap
import java.util.Map
import java.util.Random
import java.util.concurrent.locks.ReadWriteLock
import java.util.concurrent.locks.ReentrantReadWriteLock
public class CacheDataTest {
static Map<Integer,Object> dataMap=new HashMap<Integer,Object>()
static ReadWriteLock lock=new ReentrantReadWriteLock()//创建读写锁的实例
static Object getData(Integer key){
lock.readLock().lock()//读取前先上锁
Object val=null
try{
val=dataMap.get(key)
if(val == null){
// Must release read lock before acquiring write lock
lock.readLock().unlock()
lock.writeLock().lock()
try{
//可能已经由其他线程写入数据
if(val==null){
//dataMap.put(key, "")//query from db
val=queryDataFromDB(key)
}
}finally{
//Downgrade by acquiring read lock before releasing write lock
lock.readLock().lock()
// Unlock write, still hold read
lock.writeLock().unlock()
}
}
}finally{
lock.readLock().unlock()//最后一定不要忘记释放锁
}
System.out.println("get data key="+key+">val="+val)
return val
}
static Object queryDataFromDB(Integer key){
Object val=new Random().nextInt(1000)
dataMap.put(key, val)
System.out.println("write into data key="+key+">val="+val)
return val
}
public static void main(String[] args) {
for(int i=0i<10i++){
new Thread(new Runnable(){public void run() {
getData(new Random().nextInt(5))
}}).start()
}
}
}
根据你的想法,建议将两种方式整合下,建议如下设置:
接根据业务层的需要,把频繁使用的多个表数据进行整合,并利用视图的方式进行访问,这样既能减少数据表的压力,也能保持数据的准确性;
根据向系统设定场景,将经常使用到的数据存放在缓存中,缓存建议使用radis等非关系型数据库;
根据数据量确定,数据量比较大的,可以使用中间表等方式,如果数据量小而多的,放在缓存中最好,提高命中率。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)