0

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

Q:设计一个功能,实时统计你的网站访问量,统计一天的网站访问量,统计一周的网站访问量。

我知道这将需要一个循环数据结构。在 Java 实现CircularBufferCircular LinkedList.
如果循环缓冲区不是正确的解决方案,那是什么?

4

4 回答 4

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

如果需要,您可以制作字段volatilesynchronized打开incrementCount()

于 2013-11-04T14:50:59.320 回答
0

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

于 2013-11-04T14:53:01.967 回答
0

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

诀窍是在超出容量时删除数据,您可以通过创建一个固定大小的数组来做到这一点。然后使用 readpointer 和 writerpointer。当写指针重叠并与读指针位于同一位置时,移动两者。

如果您显示现有代码,我们将为您提供帮助。

于 2013-11-04T14:18:51.180 回答
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));
}

如果您必须在某个阈值后清除它,那也很简单。希望能帮助到你。

于 2013-11-04T14:49:42.890 回答