面试必问:如何保证接口的幂等性?
一、引言为什么幂等性是面试必考题在互联网系统的后端研发中有一个概念几乎贯穿了所有核心业务的稳定性设计那就是接口幂等性。无论是支付、下单、转账、积分发放、消息消费还是开放平台的对外接口幂等性都是无法绕开的话题。面试官之所以高频考察幂等性一方面是因为它在真实业务中极易踩坑另一方面是因为它能够综合考察候选人对分布式系统、数据库、缓存、锁机制、状态机等多方面知识的理解深度。设想这样一个场景用户在电商平台点击“提交订单”按钮由于网络抖动前端在 3 秒内没有收到服务端响应于是自动进行了重试。如果服务端没有做幂等处理就可能导致同一个订单被创建两次、同一个优惠券被扣减两次、同一笔款项被重复发起支付请求。再比如支付回调第三方支付平台为了保证通知到达通常会对同一个回调通知重试多次如果我们的回调处理逻辑不具备幂等性用户就可能被重复扣款或者重复入账。这些问题的本质都是因为接口被重复调用时产生了不期望的副作用。因此理解并掌握接口幂等性的设计与实现是衡量一个后端工程师是否具备生产级系统设计能力的重要标准。本文将从幂等性的基本概念讲起深入分析幂等性问题的根源逐一拆解主流实现方案并结合支付、订单、消息消费等真实业务场景给出可落地的 Java 代码示例最后汇总高频面试题与回答思路帮助读者系统性地建立幂等性知识体系。二、幂等性的基本概念2.1 什么是幂等幂等这个词来源于数学中的“幂等元”概念。在数学中如果一个元素与自身进行某种二元运算后结果仍然是它自身那么这个元素就具有幂等性。例如实数集合中的 0 和 1 在乘法运算下是幂等的因为 0 × 0 01 × 1 1。把这个概念迁移到计算机领域幂等通常被描述为同一个操作执行一次和执行多次对系统产生的影响是相同的且不会因为重复执行而产生额外的副作用。在接口层面幂等性可以更精确地定义为对同一个接口发起的一次或多次相同的请求除了第一次请求会产生真实业务效果之外后续重复请求不会改变系统的业务状态并且返回结果应当与第一次请求保持一致或者明确提示重复。这里的“相同请求”通常指的是携带相同幂等标识或业务唯一键的请求。需要注意的是幂等并不等于“接口只能被调用一次”而是指“这个接口可以被安全地重复调用”。例如查询类接口天然就是幂等的因为它只读取数据而不修改数据而写入类接口则需要通过额外设计来保证幂等。2.2 幂等性与并发安全的关系很多初学者容易把幂等性和线程安全、并发控制混为一谈实际上它们是相关但不同层次的概念。幂等性关注的是“同一个请求重复提交”的场景强调的是重复调用不会产生额外副作用并发安全关注的是“多个不同请求同时执行”的场景强调多个操作同时发生时数据的一致性。两者经常需要配合使用在并发场景下多个相同的请求同时到达仅仅有幂等逻辑还不够还需要通过锁或者数据库约束来保证最终只成功一次。举例来说如果两个相同的下单请求同时到达服务端单纯使用“先查再插入”的幂等判断逻辑存在竞态条件两个请求可能都查到“订单不存在”然后同时插入最终还是产生了重复订单。因此真正的幂等设计必须结合原子性手段比如数据库唯一索引、分布式锁等。2.3 幂等性的三个核心要素一次完整的幂等设计通常包含三个核心要素幂等标识、业务状态判断、原子性保障。幂等标识用于唯一标识一次业务请求可以是客户端生成的 Token、请求流水号也可以是业务本身的唯一键如订单号、交易号等。业务状态判断用于确定当前请求是首次处理还是重复请求通常通过查询数据库中的记录或者缓存来实现。原子性保障则是为了解决并发场景下的竞态问题常见手段包括数据库唯一约束、分布式锁、事务等。三者缺一不可才能构建出真正可靠的幂等接口。三、什么场景下需要幂等性3.1 网络重试场景在分布式系统中服务之间的调用普遍采用超时重试机制来提高可用性。当一个请求因为网络超时而返回失败时调用方往往会自动发起重试。但问题在于“超时”并不代表服务端没有执行成功可能只是响应报文在传输过程中丢失了。如果被调用的服务不具备幂等性重试就会导致重复执行。典型场景包括微服务之间的 RPC 调用、消息队列的自动重投、网关层的自动重试等。消息队列是网络重试场景的重灾区。以 Kafka 和 RocketMQ 为例它们都提供“至少一次”的投递语义这意味着同一条消息可能被消费者重复消费。如果消费者的处理逻辑不具备幂等性重复消费就会造成业务数据错误。因此凡是涉及消息消费的业务都必须设计幂等逻辑。3.2 用户重复操作场景用户在操作前端页面时可能因为网络卡顿、手速过快、双击按钮等原因在极短时间内发起多次相同的请求。例如用户在点击“支付”按钮后因为页面没有及时响应而连续点击多次或者在提交表单时路由器切换导致请求重复发送。这类场景中服务端无法依赖前端做完全的防重复提交因为前端的按钮置灰、防抖等手段在页面刷新、多端登录、恶意请求等情况下都会失效服务端必须具备兜底的幂等能力。3.3 定时任务与补偿任务场景业务系统中常见的定时任务和补偿任务同样面临幂等性问题。定时任务在执行过程中如果因为异常中断重新调度时可能从头开始执行补偿任务在对账后发现异常可能对同一笔订单发起多次补偿推送。这些场景都要求任务的处理逻辑具备幂等性以保证无论执行多少次最终的业务状态都是正确的。3.4 分布式事务与回调场景在涉及跨系统资金操作的场景中第三方平台往往会通过异步回调通知业务系统处理结果。以支付回调为例微信支付和支付宝的回调通知都可能因为网络原因重复推送甚至可能在业务系统已经处理完成后再次推送。如果回调接口不具备幂等性就会导致重复入账或者重复发货。因此所有对外的回调接口都应当被视为必须做幂等设计的关键接口。四、HTTP 方法与幂等性的天然关系4.1 HTTP 规范中的幂等方法在 HTTP 协议规范中不同的请求方法本身被赋予了不同的幂等语义。理解这些语义有助于我们在设计 RESTful 接口时做出合理的方法选择。根据 HTTP 规范GET、HEAD、PUT、DELETE 是幂等方法而 POST 不是幂等方法。GET 和 HEAD 是只读方法它们不会修改服务端资源因此无论请求多少次结果都是相同的天然幂等。PUT 用于整体替换资源其语义是“把资源设置为某个确定的状态”即使重复执行多次最终资源的状态也都是最后一次设置的状态因此具备幂等性。DELETE 用于删除资源第一次删除成功后资源不存在后续删除仍然返回成功或者 404资源始终处于“已删除”状态因此也是幂等的。POST 用于创建资源每次请求都会创建一个新的资源重复提交会产生多个资源因此不具备幂等性。4.2 实际开发中的方法选择建议在业务开发中我们应当尽量利用 HTTP 方法的天然幂等语义来降低幂等设计的复杂度。例如更新用户信息时优先使用 PUT 而不是 POST删除资源时优先使用 DELETE。但需要注意的是HTTP 方法的幂等语义只能解决部分场景对于创建订单、支付等必然涉及副作用的 POST 场景仍然需要通过业务层面的幂等设计来兜底。此外还有一个常见误区需要澄清PUT 的幂等性只保证“服务端资源状态一致”并不保证“返回结果完全一致”。例如第一次 PUT 返回 200第二次 PUT 可能因为资源版本冲突返回 409这两次返回的状态码不同但资源状态是一致的这仍然符合幂等的语义。五、幂等性问题的根源分析5.1 请求链路中的不确定性要真正解决幂等性问题首先需要理解重复请求的来源。在一个典型的请求链路中请求会经过客户端、网关、服务集群、数据库等多个环节每一个环节都可能因为网络、负载、故障等原因产生不确定性。客户端可能在超时后重试网关可能在转发失败后重试服务集群在发布过程中的请求切换也可能导致一次请求被执行了多次。正是这些链路中的不确定性导致了“请求被重复执行”成为一个无法完全避免的普遍现象。5.2 缺少唯一标识与状态记录从系统设计的角度来看幂等性问题的本质是系统无法识别“这是不是同一个请求”以及“这个请求之前是否已经成功处理过”。如果每个请求都携带了全局唯一的标识并且系统在处理请求后会记录该标识的处理状态那么重复请求到达时就可以直接返回之前的结果而不会产生新的副作用。反之如果缺少唯一标识系统就无法区分新请求和重复请求如果缺少状态记录即使知道是重复请求也无法判断之前是否处理成功。5.3 并发的竞态条件即便有了唯一标识如果“判断是否处理过”和“执行处理逻辑”这两步不是原子操作在并发场景下仍然会产生竞态条件。两个相同的请求同时到达时都会发现“没有处理过”然后都执行处理逻辑。这是典型的 check-then-act 竞态问题需要通过数据库约束、锁等原子性手段来根治。六、接口幂等性实现方案总览针对上述根源业界已经沉淀出了多种成熟的幂等性实现方案。从整体思路上可以归纳为三大类基于唯一约束、基于状态校验、基于令牌/锁。基于唯一约束的方案利用数据库唯一索引天然的去重能力以业务唯一键或者专门的幂等流水号作为约束字段重复插入时数据库会拒绝从而保证只有第一次请求成功。基于状态校验的方案则是在处理前先检查业务的当前状态只有满足条件的状态才允许继续流转典型手段是状态机和乐观锁。基于令牌/锁的方案则在进入业务逻辑前先争抢一个令牌或者锁抢到的请求才能继续执行典型手段是 Redis 分布式锁和 Token 机制。下面逐一详细拆解这些方案并结合 Java 代码给出具体实现。为便于理解本文代码示例统一使用 Spring Boot、MyBatis-Plus、Redis 和 MySQL 作为技术栈这也是国内互联网公司最常见的后端组合。对于没有特殊说明的场景读者可以将代码直接套用到自己的项目中。七、方案一数据库唯一约束7.1 原理说明数据库唯一约束是幂等设计中最常用也是最可靠的手段之一。它的核心思想是为与业务唯一性相关的字段建立唯一索引当重复请求尝试插入相同的数据时数据库会抛出唯一键冲突异常应用捕获该异常后将其视为“重复请求”直接返回之前的处理结果或者“处理中/已处理”的提示。唯一约束的可靠性来源于数据库自身的 ACID 特性。数据库在插入数据时会通过索引锁保证并发场景下只有一个插入能够成功其他相同键值的插入会阻塞等待并最终失败因此它天然能够解决 check-then-act 的竞态问题。这也是唯一约束方案相对于“先查再插”方案的巨大优势。7.2 实现步骤以一个“创建订单”接口为例我们的业务规则是同一个订单号只能创建一次订单。首先在订单表的订单号字段上建立唯一索引。建表语句如下CREATE TABLE t_order ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 主键, order_no VARCHAR(64) NOT NULL COMMENT 订单号, user_id BIGINT NOT NULL COMMENT 用户ID, amount DECIMAL(10,2) NOT NULL COMMENT 订单金额, status TINYINT NOT NULL DEFAULT 0 COMMENT 订单状态, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单表;订单号由客户端生成或者由服务端在创建请求时生成同一个业务请求全程使用同一个订单号。服务端的处理逻辑如下Transactional(rollbackFor Exception.class) public Order createOrder(OrderCreateRequest request) { String orderNo request.getOrderNo(); // 1. 先尝试查询是否已存在用于快速返回幂等结果 Order existing orderMapper.selectByOrderNo(orderNo); if (existing ! null) { return existing; } try { // 2. 不存在则插入依赖唯一索引兜底并发 Order order new Order(); order.setOrderNo(orderNo); order.setUserId(request.getUserId()); order.setAmount(request.getAmount()); order.setStatus(OrderStatus.CREATED.getCode()); orderMapper.insert(order); return order; } catch (DuplicateKeyException e) { // 3. 并发场景下唯一索引冲突说明已有相同订单返回已存在订单 return orderMapper.selectByOrderNo(orderNo); } }上面的代码做了三层防护第一层是常规的“先查”用于应对大多数非并发场景避免不必要的异常开销第二层是插入操作正常创建订单第三层是捕获唯一键冲突异常。当两个相同请求并发到达时它们可能都通过了第一层的查询但只有一个能成功插入另一个会抛出 DuplicateKeyException。捕获异常后再查询一次即可拿到已插入的订单并返回。通过这种组合方式无论请求是串行重复还是并发重复都能保证只创建一个订单。7.3 使用场景与注意事项数据库唯一约束方案最适合的场景是业务本身存在天然唯一的业务键比如订单号、交易号、用户手机号、证件号等。对于这类场景唯一约束不仅是幂等设计更是数据模型正确性的根本保障。使用该方案时有几个注意点。第一捕获异常后要进行二次查询确认而不是盲目返回“重复”因为有极小的概率唯一键冲突是由其他字段引起的。第二唯一键冲突异常会导致事务中已经执行的部分语句回滚的时机变得复杂特别是当插入语句前面的业务逻辑有副作用时需要注意整个事务的边界设计建议将幂等判断放在事务的最前面。第三对于分库分表场景唯一索引只能保证单分片内的唯一性跨分片时需要借助全局唯一 ID 或者单独的幂等流水表来保证唯一性。八、方案二Token 令牌机制8.1 原理说明Token 令牌机制是防重复提交场景下非常流行的一种方案它通过“先申请令牌、后携带令牌提交”的两步流程来保证请求的幂等性。具体流程如下客户端在打开表单页面时先调用服务端接口获取一个全局唯一的 Token服务端将这个 Token 存放到 Redis 中并返回给客户端客户端提交业务请求时必须在请求参数中携带这个 Token服务端在处理业务前先从 Redis 中删除该 Token只有删除成功的请求才是首次请求可以继续执行业务如果删除失败说明该 Token 已经被消费过请求属于重复提交直接返回幂等提示。Token 机制的精妙之处在于它利用了 Redis 的原子删除能力把“判断是否首次请求”这个步骤变成了一个原子操作从根本上避免了并发竞态。同时Token 的生命周期由服务端控制可以设置过期时间兼顾了防重复和安全回收。8.2 完整代码示例下面给出基于 Spring Boot 和 Redis 的 Token 机制完整实现。首先定义一个工具类来生成和管理 TokenComponent public class IdempotentTokenManager { private static final String TOKEN_KEY_PREFIX idempotent:token:; private static final long TOKEN_EXPIRE_SECONDS 30 * 60L; Autowired private StringRedisTemplate redisTemplate; /** * 生成幂等 Token 并存入 Redis */ public String createToken() { String token UUID.randomUUID().toString().replace(-, ); String key TOKEN_KEY_PREFIX token; redisTemplate.opsForValue().set(key, 1, TOKEN_EXPIRE_SECONDS, TimeUnit.SECONDS); return token; } /** * 校验并消费 Token返回 true 表示首次提交false 表示重复提交 */ public boolean tryConsumeToken(String token) { if (token null || token.isEmpty()) { return false; } String key TOKEN_KEY_PREFIX token; // 使用 Lua 脚本保证「存在才删除」的原子性 String lua if redis.call(exists, KEYS[1]) 1 then return redis.call(del, KEYS[1]) else return 0 end; Long result redisTemplate.execute( new DefaultRedisScriptlt;gt;(lua, Long.class), Collections.singletonList(key) ); return result ! null amp;amp; result gt; 0; } }在控制层暴露两个接口一个用于获取 Token一个用于提交订单。提交订单接口会先尝试消费 Token只有消费成功才继续执行业务。RestController RequestMapping(/order) public class OrderController { Autowired private IdempotentTokenManager tokenManager; Autowired private OrderService orderService; GetMapping(/token) public ResultString token() { return Result.success(tokenManager.createToken()); } PostMapping(/submit) public ResultString submit(RequestBody OrderSubmitRequest request) { boolean first tokenManager.tryConsumeToken(request.getToken()); if (!first) { return Result.fail(请勿重复提交); } orderService.submitOrder(request); return Result.success(下单成功); } }需要说明的是Token 机制主要解决客户端表单重复提交场景它更偏向于「防重」。对于服务端主动重试或者消息重复消费这类场景Token 机制并不合适因为重试请求不会重新携带 Token。九、方案三基于状态校验状态机与乐观锁9.1 状态机约束的原理很多业务对象在生命周期中有明确的状态流转规则例如订单会经历「待支付、已支付、已发货、已完成、已取消」等状态每一次合法流转都有严格的边界条件。状态机方案的本质就是把幂等性交给业务状态本身来保证只有当前状态满足流转条件时更新才会生效重复请求由于状态已经不再是前置状态更新条件不成立自然不会产生副作用。9.2 乐观锁版本号乐观锁是状态校验的另一种常见实现通常为记录增加一个 version 字段。更新时带上当前版本号作为条件并且将版本号加一。如果重复请求携带的是旧版本号第二次更新会因为版本号不匹配而影响 0 行从而避免重复变更。乐观锁与唯一约束的关键区别在于唯一约束解决的是「重复插入」它不允许出现重复记录乐观锁解决的是「重复更新」它允许记录存在但通过版本号阻止重复写操作产生多次副作用。9.3 代码示例以订单状态流转为例只允许「待支付」状态的订单被更新为「已支付」并借助版本号实现并发安全。public boolean payOrder(String orderNo, int currentVersion) { OrderUpdate update new OrderUpdate(); update.setOrderNo(orderNo); update.setFromStatus(OrderStatus.UNPAID.getCode()); update.setToStatus(OrderStatus.PAID.getCode()); update.setVersion(currentVersion); int rows orderMapper.updatePayStatus(update); return rows 0; }对应的 SQL 通过 status 和 version 两个条件保证原子性UPDATE t_order SET status 2, version version 1 WHERE order_no #{orderNo} AND status 1 AND version #{version}如果两个回调同时到达都读到 status1、version1但最终只有一个请求的 UPDATE 能影响一行另一个影响 0 行。业务代码根据返回值判断是否已经处理过从而返回幂等结果。十、方案四Redis 分布式锁10.1 原理说明Redis 分布式锁通过 SET NX 命令保证在分布式环境下同一时刻只有一个请求能获取锁。执行幂等业务前先尝试加锁加锁成功后查询业务状态并执行业务如果加锁失败说明其他请求正在处理同一个业务可以选择短暂等待后查询结果或者直接返回「处理中」。不过需要特别注意分布式锁主要解决并发互斥问题它本身不记录「这个请求是否处理过」。因此单纯使用分布式锁时还需要配合业务唯一键或状态记录来完成真正的幂等判断。10.2 代码示例下面的示例以订单号为锁粒度将「加锁、查状态、处理、释放锁」串起来。为了避免死锁锁必须设置过期时间。public void processPayCallback(PayCallbackRequest request) { String orderNo request.getOrderNo(); String lockKey idempotent:lock: orderNo; String lockValue UUID.randomUUID().toString(); Boolean locked redisTemplate.opsForValue() .setIfAbsent(lockKey, lockValue, 30, TimeUnit.SECONDS); if (Boolean.FALSE.equals(locked)) { // 其他请求正在处理同一个订单可直接返回或稍后查询结果 return; } try { Order order orderMapper.selectByOrderNo(orderNo); if (order ! null amp;amp; order.isPaid()) { return; // 已处理过幂等返回 } doPayCallback(request); } finally { // 只有持有锁的请求才释放锁避免误删 String value redisTemplate.opsForValue().get(lockKey); if (lockValue.equals(value)) { redisTemplate.delete(lockKey); } } }上面的释放锁逻辑使用锁值比对避免业务执行时间超过锁过期时间后前一个请求释放了后一个请求持有的锁。10.3 注意事项使用分布式锁需要注意三点。第一锁粒度要尽可能小以业务唯一键为粒度避免影响无关请求。第二锁必须设置过期时间防止业务异常导致锁无法释放。第三释放锁时要校验锁归属防止锁过期后被其它请求获取并误删。对于可靠性要求极高的场景建议使用 Redisson 等成熟框架而不是手写 Redis 锁。十一、幂等性方案对比与选型不同方案适用于不同场景实际项目中往往需要组合使用。下面从核心机制、可靠性、适用场景三个维度做对比。方案核心机制可靠性适用场景数据库唯一约束唯一索引 异常捕获高有天然业务唯一键的插入场景Token 令牌Redis 原子删除高客户端防重复提交状态机 / 乐观锁状态条件 版本号高状态流转、重复更新场景Redis 分布式锁互斥加锁中高并发控制需配合状态记录选型时可以先回答三个问题这个业务有没有天然唯一键重复请求来自客户端还是服务端业务动作是插入还是更新大多数支付、订单场景推荐「数据库唯一约束 状态机」表单提交场景推荐「Token 机制」回调重试场景推荐「唯一约束 状态机」的组合。十二、幂等性设计的最佳实践在实际落地幂等设计时有六条经验值得参考。第一幂等键要尽早确定优先使用业务天然唯一键没有天然唯一键时再引入独立的幂等流水号。第二不要依赖前端防重前端按钮置灰只能作为体验优化服务端必须兜底。第三幂等判断要放在业务处理的最前面并且尽量与业务写入放在同一个事务或同一个原子操作中。第四幂等结果要可返回记录业务处理结果重复请求直接返回首次处理结果。第五对外部回调接口一律做幂等回调不是只来一次而是可能来很多次。第六为幂等组件建立统一封装通过注解或切面统一处理避免每个业务各自写一套导致逻辑分散。十三、高频面试题与回答思路13.1 什么是幂等性它和并发安全有什么区别回答思路幂等性针对同一个请求重复提交强调重复调用不会产生额外副作用并发安全针对多个不同请求同时执行强调多请求下数据一致性。两者层次不同但幂等实现通常需要借助并发控制手段。13.2 哪些场景需要做幂等回答思路网络重试、用户重复操作、定时任务与补偿、分布式事务回调、消息重复消费等场景。核心是同一个业务操作可能被执行多次每次执行都不能产生额外副作用。13.3 数据库唯一约束实现幂等时如何解决并发问题回答思路利用唯一索引的原子性。不要只做「先查再插」而是先查用于快速返回真正兜底靠唯一键冲突异常捕获异常后二次查询返回结果。数据库索引锁保证并发下只有一个插入成功。13.4 Token 机制和分布式锁有什么区别回答思路Token 机制通过 Redis 原子删除来标记「已被消费」解决重复提交分布式锁通过互斥保证同一时刻只有一个请求执行解决并发竞争。Token 更偏业务防重分布式锁更偏互斥控制通常还需要配合状态记录。13.5 HTTP 哪些方法是幂等的为什么 POST 不幂等回答思路GET、HEAD、PUT、DELETE 幂等POST 不幂等。因为 POST 语义是创建资源每次执行都会产生新资源天然不幂等。实际业务中 POST 创建、支付等场景需要业务层幂等设计兜底。十四、总结本文从幂等性的定义出发梳理了网络重试、用户重复操作、定时补偿、回调等典型场景分析了重复请求产生的三个根源——链路不确定性、缺少唯一标识与状态记录、并发竞态条件并系统拆解了数据库唯一约束、Token 令牌、状态机与乐观锁、Redis 分布式锁四类方案。可以看出幂等性不是某一个工具或某一段代码而是一种贯穿系统设计的思维方式。真正可靠的幂等接口需要结合业务唯一键、原子性手段和结果记录在提升系统稳定性的同时为后续的扩展和排查打下基础。

相关新闻

插入排序为什么这样写?从腾位置到二分,再到希尔排序

插入排序为什么这样写?从腾位置到二分,再到希尔排序

插入排序为什么这样写?从腾位置到二分,再到希尔排序 如果不先背代码,直接插入排序其实很好想到:先整理好一部分,每拿到一个新数,就给它找个位置,插进去。 但“插进去”在数组里怎么实现&#…

2026/10/11 1:45:38 阅读更多 →
基于微信小程序的旧物回收捐赠平台设计与实现

基于微信小程序的旧物回收捐赠平台设计与实现

温馨提示: 本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示: 本人主页置顶文章(点我)开头有 CSDN平台官方提供的学长联系方式的名片! 温馨提示: 本人主页置顶文章(点我)开头有 CSDN 平…

2026/10/11 1:45:38 阅读更多 →
苏州办公室甲醛检测:分批家具进场怎样建立可追溯台账

苏州办公室甲醛检测:分批家具进场怎样建立可追溯台账

苏州办公室甲醛检测遇到家具分批进场,先把采购批次对应到实际房间,再分别记录到货、安装收口、摆放和启用状态。行政、物业与检测机构需要确认的是“本次检测代表哪一版办公室配置”,不能用一句“家具已到齐”代替。把配置版本、检测范围和报…

2026/10/11 1:45:38 阅读更多 →

最新新闻

服务器初始化步骤简述

服务器初始化步骤简述

服务器初始化完成硬件上电,通过控制台/IPMI登录操作系统,获取服务器操作终端。配置网络配置网卡IP、网关、DNS,测试内网、外网连通。为yum下载、时间同步等后续操作提供网络基础。配置Yum源替换为国内镜像源,清理并生成yum缓存&am…

2026/10/11 4:25:11 阅读更多 →
DESIGN.md 完整指南:一份 Markdown 设计系统文件,让 AI 生成视觉一致的 UI

DESIGN.md 完整指南:一份 Markdown 设计系统文件,让 AI 生成视觉一致的 UI

DESIGN.md 完整指南:一份 Markdown 设计系统文件,让 AI 生成视觉一致的 UI 【免费下载链接】awesome-design-md A collection of DESIGN.md files analysis by popular brand design systems. Drop one into your project and let coding agents generat…

2026/10/11 4:25:11 阅读更多 →
Open Generative AI 快速上手:420+ 模型的免费 AI 图像与视频生成工作室,无订阅费

Open Generative AI 快速上手:420+ 模型的免费 AI 图像与视频生成工作室,无订阅费

Open Generative AI 快速上手:420 模型的免费 AI 图像与视频生成工作室,无订阅费 【免费下载链接】Open-Generative-AI Unrestricted Open-source alternative to AI video platforms — Free AI image & video generation studio with 600 models (…

2026/10/11 4:25:11 阅读更多 →
Gradle报错No tests found排查指南:原因与解决方案

Gradle报错No tests found排查指南:原因与解决方案

直接说结论:Execution failed for task :xxxx-api:test. > No tests found for given includes:这行报错,八成不是你的测试代码写挂了,而是 Gradle 在 test 任务阶段压根没发现任何它认为需要测试的类。这个报错在 Java/Kotlin 多模块项目…

2026/10/11 4:25:11 阅读更多 →
PS5通用优化指南:容量、散热、存档与远程游玩全攻略

PS5通用优化指南:容量、散热、存档与远程游玩全攻略

最近帮身边好几个人折腾了PS5,发现一个挺有意思的现象:不管是首发入的首批机器,还是后来买的改款,甚至是收来的二手,大家遇到的问题几乎一模一样——硬盘不够用、系统选项看不懂、主机烫得能煎鸡蛋,还有存档…

2026/10/11 4:25:11 阅读更多 →
nodejs 获取客服端ip,以及获取ip一直都是127.0.0.1的问题

nodejs 获取客服端ip,以及获取ip一直都是127.0.0.1的问题

个人博客(vue3 nodejs mysql )http://36.151.145.67:30000/ 一、问题描述 在做登录日志的时候想要获取客户端的ip, 网上查了一下 通过 req.headers[x-forwarded-for] || req.connection.remoteAddress; 获取, 结果获取了之后不管是开发环境&#xf…

2026/10/11 4:24:11 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →