当前位置:编程学习 > JAVA >>

JAVA怎样做一个缓存到一定量数据后批量转移到其他地方,避免缓存太大至内存溢出?

我想实现一个缓存队列,并发情况下向该队列写入,当达到一定量后,缓存中转移一部分数据到数据库中,同时也有多条线程在消费该缓存队列,类是一个生产者-消费者,生产能力远大于消费能力,求各位给个思路。 

下面是我的一段代码,运行起来不报错,但是达不到我要的效果,也请各位看看,指点下问题。 
package com.pb.test.queue;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.ReentrantLock;

public class MessageQueue {
private BlockingQueue<Object> queue = new LinkedBlockingQueue<Object>(10);

private BlockingQueue<Object> bufferQueue = new LinkedBlockingQueue<Object>();

// 模拟数据库
private BlockingQueue<Object> dbQueue = new LinkedBlockingQueue<Object>();

private final AtomicBoolean isQueueAdded = new AtomicBoolean(true);

private final ReentrantLock putLock = new ReentrantLock();

public void add(Object o) {
if (isQueueAdded.get()) {
if (!queue.offer(o)) {
addBuffer(o);
isQueueAdded.set(false);
}
} else {
addBuffer(o);
}
}

private void addBuffer(Object o) {
bufferQueue.offer(o);

// 模拟向数据库写入
if (bufferQueue.size() >= 20) {
List<Object> ary = new ArrayList<Object>();
bufferQueue.drainTo(ary);

for (Object i : ary) {
dbQueue.offer(i);
}
}
}

/**
 * 先从queue开始消费,消费完了开始消费数据库缓存的,然后在消费bufferQueue队列中的
 * 
 * @return
 */
public Object poll() {
Object o = queue.poll();
if (o != null) {
return o;
}

final ReentrantLock putLock = this.putLock;
putLock.lock();
try {
List<Object> ary = new ArrayList<Object>(10);
int s = dbQueue.drainTo(ary, 10);

if (s == 0) {
o = bufferQueue.poll();

if (o == null) {
isQueueAdded.set(true);
}

return o;
} else {
for (Object i : ary) {
queue.offer(i);
}

return queue.poll();
}

} finally {
putLock.unlock();
}
}

public void display() {
System.out.println(queue.size() + "\t" + bufferQueue.size() + "\t" + dbQueue.size() + "\t" + (queue.size() + bufferQueue.size() + dbQueue.size()));
}
}
--------------------编程问答-------------------- 建议使用第三方缓存系统,比如 Redis, Memcached 之类的。 --------------------编程问答-------------------- 不用这两个东西能实现吗?
能给个具体思路吗? --------------------编程问答-------------------- 那你就存在链表中咯。等链表达到一点数量就转移呀。 --------------------编程问答-------------------- 像二级,三级缓存
一级一级的把缓存的东西往下移动
补充:Java ,  Java相关
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,