实时计算最后一分钟内对服务器的点击次数的有效方法



假设您有一个不断接收HTTP请求的服务器。你的老板需要一些统计数据,并要求你计算在任何给定时间最后一分钟内的命中次数。

你会使用什么算法和数据结构来实现这一点?

使用循环缓冲区。

每当您必须保留一些内置过时的当前统计数据时,环形缓冲区是一个很好的候选者。在您的情况下,您可以通过在循环缓冲区的前面插入新的数据包并在缓冲区中保留一分钟前的指针,或者在请求时间执行二进制搜索,来轻松地统计最后一分钟的请求。

一个动态数组,磁盘上对应的是一个仅追加的文件。只要在数组出现时将每个命中值附加到数组中,就可以按时间排序。追加需要摊销固定时间。您可以进行二进制搜索(或插值搜索)以找到最后一分钟开始的点,然后在O(lgn)(或(O(lglgnn))时间内求和到结束。

或者,从最后开始进行线性扫描,而不是二进制搜索,如果文件变得很大,并且只需要最后一分钟,这会更快。如果最后一分钟的预期命中次数与时间无关,则只需要恒定的时间(但向后读取旋转磁盘上的文件可能会很慢)。

如果您没有存储所有旧数据的空间,那么使用deque是一个更好的主意。deques的良好实现可以在标准库中获得,例如C++和Python。

最新更新