接口开发完后,个人对于接下来接口优化的一些思考

优化点

入参的合法性和长度范围,必填项的检查验证

因为没有入参,所以不需要考虑。

批量思想解决N+1问题
java 复制代码
// 假设要查询100个订单及其对应的用户信息
List<Order> orders = orderMapper.selectList(new QueryWrapper<>().last("limit 100"));

// N+1问题: 循环查询每个订单的用户信息
for (Order order : orders) {
    // 每个订单都要单独发起一次SQL查询用户信息
    User user = userMapper.selectById(order.getUserId());
    order.setUserName(user.getName());
}
  • 1次查询订单列表
  • N次查询用户信息(N=订单数量)
    总计: N+1次查询
java 复制代码
-- 第1次查询
SELECT * FROM orders LIMIT 100;

-- 然后是N次单独的用户查询
SELECT * FROM users WHERE id = 1;
SELECT * FROM users WHERE id = 2;
SELECT * FROM users WHERE id = 3;
...
java 复制代码
// 1. 先查询订单列表
List<Order> orders = orderMapper.selectList(new QueryWrapper<>().last("limit 100"));

// 2. 收集所有用户ID
List<Long> userIds = orders.stream()
    .map(Order::getUserId)
    .collect(Collectors.toList());

// 3. 一次性批量查询所有用户信息
List<User> users = userMapper.selectBatchIds(userIds);

// 4. 构建用户ID到用户信息的映射
Map<Long, User> userMap = users.stream()
    .collect(Collectors.toMap(User::getId, u -> u));

// 5. 填充订单的用户信息
for (Order order : orders) {
    User user = userMap.get(order.getUserId());
    order.setUserName(user.getName());
}
java 复制代码
-- 第1次查询
SELECT * FROM orders LIMIT 100;

-- 第2次批量查询
SELECT * FROM users WHERE id IN (1,2,3,...);

批量查询只产生2条SQL,不限于读取(批量读取),写入(批量写入)也是一样的。

异步思想:解决长耗时问题

因为没有入参,所以不需要考虑

并行思想:把大任务拆分多个子任务,让多个子任务同时执行(人多力量大)
空间换时间思想:使用**++缓存++**降低耗时

使用缓存虽然可以提升用户体验,但是也会带来其他问题,如数据一致性问题。还有缓存穿透、缓存击穿、缓存雪崩、缓存淘汰等问题。

复用思想:线程连接池、数据库连接池

连接池的原理是通过预先创建一定数量的连接对象,并将其保存在池中。当需要使用连接时,从池中获取一个可用的连接对象,使用完毕后归还给池,而不是每次都创建和销毁连接对象。这样可以避免频繁地创建和销毁连接对象,提高系统性能和资源利用率。

数据量大的时候,使用压缩算法减少传输数据的时间

Content-Encoding 是 HTTP 协议中的一个头部字段,用于指示服务器对响应内容进行了何种类型的编码压缩。它的作用是告知客户端如何解码和还原服务器返回的压缩内容。

解耦思想:使用消息队列解除强耦合性
相关推荐
FQNmxDG4S8 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全8 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje9 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv79 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫9 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287929 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本9 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211239 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯12 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户606487671889612 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java