news 2026/9/13 10:15:14

WHAT - 幂等 Idempotence

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WHAT - 幂等 Idempotence

文章目录

  • 什么是幂等(Idempotence)
    • 幂等操作
    • 非幂等操作
  • 为什么分布式系统必须要幂等
  • HTTP 方法中的幂等
    • GET
    • PUT
    • DELETE
    • POST
    • 幂等键
    • 数据库实现思路
    • 幂等键还要校验请求内容
    • 前端类比
  • 幂等处理的常见方案
    • 示例 1:通过请求唯一 ID 做幂等(Redis 实现)
    • 示例 2:MySQL 唯一约束防止重复插入
    • 示例 3:接口幂等 token(电商常见)
  • 总结

什么是幂等(Idempotence)

简单说:

一次请求和多次请求的结果是一样的,不会因为重复请求造成数据异常或重复处理。换句话说:同一个操作执行一次和重复执行多次,最终产生的业务状态相同。

数学上可以写成:

f(f(x)) = f(x)

幂等操作

POST /order/pay?id=12345

无论你请求一次,还是网络原因请求了 3 次,只会支付一次订单,不会重复扣钱或生成多个支付记录

非幂等操作

UPDATEaccountSETbalance=balance-100WHEREid=1;

如果这个请求执行了两次,就会多扣 100 块!

为什么分布式系统必须要幂等

在 WHAT - 事务?transaction?单个数据库事务和分布式事务 中我们介绍分布式系统中的事务(更复杂)时提及过幂等处理。

“幂等处理能力”是做分布式系统时非常关键的一个概念,尤其是在涉及重试、失败补偿、消息队列等场景中,系统必须要有能力抵抗重复请求带来的副作用

因为在以下场景中,请求可能会被多次发送

  1. 网络超时重试(调用方/中间件自动重试)
  2. MQ 消息重复投递
  3. 事务补偿机制触发多次补偿逻辑
  4. 客户端点击多次、刷新操作

如果处理逻辑不具备幂等性,就可能导致:

  • 订单重复扣款
  • 重复发货
  • 积分多次增加/减少
  • 资源状态错乱(库存被扣光)

所以幂等真正解决的是:

请求结果不确定时,客户端可以安全重试。

HTTP 方法中的幂等

偶尔在面试中会被问:哪些 http 方法是幂等的,哪些是非幂等的?

方法通常是否幂等示例
GET查询文章
PUT把文章完整设置为指定内容
DELETE删除指定文章
POST通常不是创建订单、发起支付
PATCH不一定取决于修改方式

GET

GET /posts/1

重复查询不会改变文章状态,所以幂等。

PUT

PUT /users/1 Content-Type: applicat
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 10:11:10

RK3588S软实时化实战:从Ubuntu到工业控制的确定性优化

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

作者头像 李华
网站建设 2026/9/13 10:11:01

备份介质选型实战:10TB×30天背后的性能、成本与可靠性博弈

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

作者头像 李华
网站建设 2026/9/13 10:09:47

Chrome侧边栏投屏替代QtScrcpy的技术原理与实战

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

作者头像 李华
网站建设 2026/9/13 10:07:36

BearPi-HM_Nano农业传感节点实战:E53_IA1驱动与华为IoT平台稳定接入

简介:本资源是一套基于BearPi-HM_Nano开发板的物联网农业监测系统完整工程,面向嵌入式初学者、物联网开发爱好者及高校课程实践者,解决农业环境数据采集、边缘设备联网与云平台对接等典型IoT落地问题。压缩包共305个文件,含57个C语…

作者头像 李华