讲师中心 微信公众号
AI工具推荐 视频效率加速

c#如何实现接口幂等性_c#接口幂等性完整指南一文搞懂

秋芳大大_6799

秋芳大大_6799

发布时间:2026-04-16 17:51:38

|

505人浏览过

|

来源于php中文网

原创

真正能落地的幂等方案必须满足:客户端提供稳定Idempotency-Key、服务端用Redis原子预检、数据库加唯一约束兜底;ConcurrentDictionary和lock因仅限单机而多实例下必然失效。

c#如何实现接口幂等性_c#接口幂等性完整指南一文搞懂

后端接口不做幂等控制,用户连点两次按钮、网络超时重试、前端防抖失效——都会生成重复订单、重复扣款、重复发券。这不是“概率低”,而是“必然发生”。真正能落地的幂等方案,必须满足三个硬条件:客户端提供稳定 Idempotency-Key、服务端用 Redis 做原子状态预检、数据库层加唯一约束兜底。单靠 ConcurrentDictionary 或 lock 在多实例下完全无效。

为什么 ConcurrencyDictionary 和 lock 在生产环境会失效

本地缓存类如 ConcurrentDictionary 或方法级 lock 只在单进程内有效。一旦部署到多个 IIS 实例、K8s Pod 或负载均衡后端,两个相同 Idempotency-Key 的请求可能被分发到不同机器,各自走通逻辑,最终写入两条重复记录。

  • 客户端重试时,第一次请求已落库但响应丢失,第二次进来查不到任何状态(因缓存不共享),照样执行
  • lock 锁的是当前线程或对象,对跨进程/跨机器无感知
  • 即便用 IDistributedCache,若没配合 Lua 脚本做原子读-写-过期,仍可能在「查无记录 → 写 processing」之间被另一个请求插入终态结果,造成状态覆盖

Redis 层必须用 Lua 脚本保证原子性

不能只调 SETNX + EXPIRE 两步,中间存在竞态窗口。必须用一段 Lua 脚本一次性完成「判断是否存在 → 不存在则设 processing 并过期 → 返回状态码」。

推荐脚本逻辑:

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
if redis.call("EXISTS", KEYS[1]) == 0 then
  redis.call("SETEX", KEYS[1], ARGV[1], ARGV[2])
  return 1
else
  local val = redis.call("GET", KEYS[1])
  if val == "processing" then return 2 end
  return 0
end
  • KEYS[1] 是客户端传来的 Idempotency-Key(如 "idempotent:7f8c4a2e-1b3d-4e5f-8a9c-0e1d2f3a4b5c")
  • ARGV[1] 设为 86400(24 小时),覆盖最长业务链路 + 重试窗口;太短会导致重试失败,太长会卡死异常中断的 key
  • ARGV[2] 固定为 "processing",避免空值误判为未处理
  • 返回 1 表示首次进入,可执行业务;0 表示已有终态结果(成功/失败),直接返回缓存响应;2 表示正在处理中,建议返回 409 Conflict 或阻塞等待

数据库唯一约束是最后一道不可绕过的防线

Redis 可能宕机、网络分区、或人为清理,不能作为唯一信任层。所有幂等写操作对应的业务表,必须增加字段并建唯一索引。

  • 在订单表加列:idempotency_key NVARCHAR(64) NOT NULL
  • 建唯一索引:CREATE UNIQUE INDEX IX_Orders_IdempotencyKey ON Orders(idempotency_key)
  • 插入时不先查库(查-插之间有竞态),直接用 INSERT ... ON CONFLICT DO NOTHING(PostgreSQL)或 MERGE(SQL Server)
  • 不要依赖 ORM 的“先查再 SaveChanges”,EF Core 的 ExecuteSqlRaw 或 Dapper 的原生 SQL 更可控

文件操作的幂等性常被忽略但同样关键

File.Replace 不是幂等操作——它只做路径替换,不校验内容。两次调用传入不同源文件,会无条件覆盖目标,违反「相同输入 → 相同系统状态」原则。

  • 正确做法是:先计算目标文件 SHA256 哈希(用 using var sha = SHA256.Create(),别复用静态实例)
  • 再计算源内容哈希,仅当两者不等时才写入
  • 读目标文件要用 FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read),否则被 IIS 或其他进程独占打开时直接抛 IOException
  • 别比文件大小或最后修改时间——Windows 时间戳精度只有 10ms,且可被手动篡改

最易被跳过的点:Redis key 过期时间不是拍脑袋定的,得对齐业务最长耗时(比如支付回调可能长达 30 秒)+ 客户端最大重试间隔(如 5 秒 × 3 次 = 15 秒),再加冗余。少于这个值,重试请求会被当成新请求;大于这个值,异常中断的 key 会长期卡住后续合法请求。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

1092

2023.08.08

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

3171

2023.08.31

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

905

2024.03.13

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2655

2024.03.14

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

332

2026.02.03

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

429

2026.02.06

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

631

2026.03.11

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

329

2026.04.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn