找到这个面试问题并尝试用 Java 解决它。
Q:设计一个功能,实时统计你的网站访问量,统计一天的网站访问量,统计一周的网站访问量。
我知道这将需要一个循环数据结构。在 Java 实现CircularBuffer
或Circular LinkedList
.
如果循环缓冲区不是正确的解决方案,那是什么?
找到这个面试问题并尝试用 Java 解决它。
Q:设计一个功能,实时统计你的网站访问量,统计一天的网站访问量,统计一周的网站访问量。
我知道这将需要一个循环数据结构。在 Java 实现CircularBuffer
或Circular LinkedList
.
如果循环缓冲区不是正确的解决方案,那是什么?
我会这样做。
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
并synchronized
打开incrementCount()
也许CircularFifoBuffer是您正在寻找的。正如其他人所写,我不知道循环结构是否真的是你需要的,但是来自 Apache 的 Common-Collection-Utils 已经实现了一个循环缓冲区
与循环缓冲区无关 - 但是,请查看Apache 的 Buffer Utils
诀窍是在超出容量时删除数据,您可以通过创建一个固定大小的数组来做到这一点。然后使用 readpointer 和 writerpointer。当写指针重叠并与读指针位于同一位置时,移动两者。
如果您显示现有代码,我们将为您提供帮助。
如果它只是简单地计算访问者的数量,那么计算唯一访问者的数量是一个棘手的多线程问题。这是您可以使用的最佳场所之一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));
}
如果您必须在某个阈值后清除它,那也很简单。希望能帮助到你。