找到这个面试问题并试图用Java解决它。
问:设计一个函数来提供网络的实时统计信息 交通,计算一天的网站访问量,计算一周的网站访问量。
据我所知,这需要循环数据结构。在Java实现CircularBuffer
或Circular LinkedList
的情况下哪一个是合适的。
如果循环缓冲区不是正确的解决方案那么是什么?
答案 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
synchronized
和incrementCount()
字段
答案 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已经实现了循环缓冲区