互联网大厂面试题解析之大疆一面

统计接口请求数量,以及接口耗时如何去做。

方案

首先在 Java 中统计接口请求数量,可以通过以下设计方案之一实现:

  1. 使用计数器变量:在代码中维护一个计数器变量,每当接口被调用时,增加计数器的值。这种方法简单直接,适用于单线程环境。
java 复制代码
public class RequestCounter {
    private int requestCount = 0;

    public void incrementRequestCount() {
        requestCount++;
    }

    public int getRequestCount() {
        return requestCount;
    }
}
  1. 使用并发安全的计数器:如果在多线程环境下进行统计,可以使用 Java 中的原子变量或者使用并发集合类来保证线程安全。
java 复制代码
import java.util.concurrent.atomic.AtomicInteger;

public class ConcurrentRequestCounter {
    private AtomicInteger requestCount = new AtomicInteger(0);

    public void incrementRequestCount() {
        requestCount.incrementAndGet();
    }

    public int getRequestCount() {
        return requestCount.get();
    }
}
  1. 使用拦截器或过滤器:在 Web 应用中,可以使用拦截器或过滤器来统计接口请求数量。每当请求进入时,拦截器或过滤器会进行统计操作。
  2. 使用 AOP(面向切面编程):通过 AOP 可以在方法执行前后插入统计逻辑,实现统计接口请求数量的功能,这种方法适用于更复杂的应用场景。
  3. 当然也可以借助其它中间件来去看,比如:SpringBoot - Actuator、Prometheus、Zabbix、Garafana等等。具体看实际的业务场景。

SpringBoot - Actuator应用监控使用详解3(metrics端点:度量指标信息展示)

以上是几种常见的设计方案,具体根据业务场景去选择。当然实际业务场景中也可借助一些系统已经使用的中间件,比如Redis

需求分析

当需要统计每个接口的访问量的话,首先,设计接口访问统计表是一个常规的任务,表的设计应包含一些常见字段。例如,统计类型可以按小时、天或月进行统计;接口访问名称和URL也是必要字段。另外,可以增加一个统计时间字段,其格式可以根据需求而定。对于时间段统计,可以设计开始时间和结束时间;而对于具体统计时间,可以从上次统计时间到当前时间进行统计。最后,接口访问量是另一个重要字段。设计非常灵活,没有固定的模式,可以根据项目的实际需求进行调整。

实际思路方案

  • 首先,需要一个地方来存储所有需要统计的接口信息,主要包括URL和接口说明。由于接口请求的URL通常是固定的且不会频繁更改,对于少量数据,可以考虑使用枚举值进行存储或者将这些信息配置在独立的配置文件中,并在项目中加载。对于大量接口数据,如数百甚至上千条数据,枚举值可能不太适用,可以考虑创建数据表来存储接口数据。
  • 其次,需要实现存储每次调用接口时的访问信息。对于访问量较大且需要快速响应的接口,一个简单实用的方法是将访问信息存储在缓存中,先将数据保存,然后再进行其他处理。每次访问接口时,增加该接口的访问量计数。
  • 最后我们可以使用Redis进行统计操作非常方便,可以直接对Redis中存储的某个值进行加一操作。这一步操作可以通过拦截器结合异步方式来对被访问接口进行自增操作,从而加快接口的访问效率。

完成前面的步骤后,最后一步涉及如何进行统计。通常的做法是启动一个定时任务,比如每半小时或每小时执行一次,统计接口的访问量,然后将统计数据永久存储到数据库中。这种方式可以避免在Redis服务异常时数据丢失的风险。具体的统计逻辑可以如下:

  • 定时任务触发统计操作。
  • 从Redis中获取各个接口的访问量数据。
  • 将这些数据汇总,并写入数据库进行永久存储。
  • 可以考虑保留历史统计数据,以便进行趋势分析或性能优化。

这样的设计思路可以帮助您实现接口访问统计功能,并根据项目的需求灵活调整和扩展。

SQL优化实际是怎么操作的

这个问题可参考。

如果线上遇到OOM如何解决,关于这个问题也可参考之前的文章

MySQL系列文章

JVM系列文章


如有问题,欢迎加微信交流:w714771310,备注- 技术交流 。或关注微信公众号【码上遇见你】。

免费的Chat GPT可关注公众号【AI贝塔】进行体现,无限使用。早用早享受

好了,本章节到此告一段落。希望对你有所帮助,祝学习顺利。

相关推荐
也无晴也无风雨30 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
SRY122404192 小时前
javaSE面试题
java·开发语言·面试
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
不二人生5 小时前
SQL面试题——连续出现次数
hive·sql·面试
颜淡慕潇5 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决
独泪了无痕6 小时前
WebStorm 如何调试 Vue 项目
后端·webstorm
清酒伴风(面试准备中......)6 小时前
Java集合 List——针对实习面试
java·面试·list·实习
怒放吧德德7 小时前
JUC从实战到源码:JMM总得认识一下吧
java·jvm·后端
代码小鑫7 小时前
A025-基于SpringBoot的售楼管理系统的设计与实现
java·开发语言·spring boot·后端·毕业设计