实现循环缓冲区

时间:2013-11-04 14:14:33

标签: java

找到这个面试问题并试图用Java解决它。

  

问:设计一个函数来提供网络的实时统计信息   交通,计算一天的网站访问量,计算一周的网站访问量。

据我所知,这需要循环数据结构。在Java实现CircularBufferCircular LinkedList的情况下哪一个是合适的。
如果循环缓冲区不是正确的解决方案那么是什么?

4 个答案:

答案 0 :(得分:1)

我会这样做。

private long dayCount = 0;
private long lastSixDaysCount = 0;

// called once per day
public void rollDayCount() {
    saveDayCountToDB(dayCount);
    lastSixDaysCount = sumLastSixDaysFromDB();
    dayCount = 0;
}

public void incrementCount() {
    dayCount++;
}

public long getDayCount() {
    return dayCount;
}

public long getWeekCount() {
    return dayCount + lastSixDaysCount;
}

如果需要,您可以在volatile

上填写synchronizedincrementCount()字段

答案 1 :(得分:0)

与循环缓冲区无关 - 但是,请查看Buffer Utils from apache

技巧是在超出容量时删除数据,您可以通过创建固定大小的数组来完成此操作。然后使用readpointer和writer指针。当writepointer重叠并与readpointer处于同一位置时,移动两者。

如果您展示现有代码,我们会帮助您。

答案 2 :(得分:0)

如果它只是计算访问者的数量而不是一个棘手的多线程问题,不计算唯一访问者。这是您可以使用AtomicInteger的最佳地点之一。

AtomicInteger atomicInteger = new  AtomicInteger();
public void increment(){
    Integer present=null;
    Integer expect=null;
    do{
        present=atomicInteger.get();
        expect = present+1;
    }while(!atomicInteger.compareAndSet(present, expect));
}

如果你必须在一些门槛之后清除它,那么它也很简单。希望它有所帮助。

答案 3 :(得分:0)

也许您正在寻找CircularFifoBuffer。正如其他人写的那样,我不知道圆形结构是否真的是你需要的,但Apache的Common-Collection-Utils已经实现了循环缓冲区