开发中是如何保证接口幂等性的?

article/2025/10/3 16:31:41

文章目录

  • 一、定义
  • 二、业务场景
  • 三、保证幂等性常用方法
      • 方案1: insert前先select(基于mysql的分布式锁)
      • 方案2:加悲观锁 select * from table where id = '1' for update(基于mysql的分布式锁)
      • 方案3:加乐观锁 增加一列:version 或者timestamp(基于mysql的分布式锁)
      • 方案4:建防重复表(基于mysql的分布式锁,项目开发中常用)
      • 方案5:通过状态标识字段(与乐观锁性质差不多)
      • 方案6:基于redis的分布式锁
  • 四、小结

一、定义

接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果都是一致的,不会因为多次点击而产生副作用。这类问题多发生于接口的:
1.insert操作
2 update操作,如果只是单纯的更新数据,例如:update user set login_num=1 where id = 1 是没有问题的,如果还有计算,比如:update user set login_num=login_num+1 where id = 1 ,这种情况下,多次请求,可能会导致数据错误。
简单来说:幂等性=多次相同请求,数据库无重复数据+多次相同请求,返回结果一样

二、业务场景

1.填写某些form表单时,保存按钮不小心快速点了2次,表中就产生了2条重复的数据,只是id不一样(解决方案:前端控制+方案1/方案6
2.在项目接口中为了解决接口超时问题,通常会引入重试机制,第一次请求超时,被调用方没能返回结果,于是会对该请求重试几次,这样也会产生重复的数据(解决方案:方案4
3.mq消费者在读取消息时,有时候会读取到重复的消息,处理不好,也会产生重复的数据(解决方案:方案4

三、保证幂等性常用方法

方案1: insert前先select(基于mysql的分布式锁)

流程图如下:
在这里插入图片描述

方案1说明
性能不如redis分布式锁,查询条件必须走索引,否则会锁整张表

方案2:加悲观锁 select * from table where id = ‘1’ for update(基于mysql的分布式锁)

流程图如下:
在这里插入图片描述

方案2说明
性能不如redis分布式锁,查询条件必须走索引,否则会锁整张表,容易造成死锁

方案3:加乐观锁 增加一列:version 或者timestamp(基于mysql的分布式锁)

流程图如下:
在这里插入图片描述

方案3说明
SQL-1:update user set amount = amount-100,version=version+1 where id = 1 and version =1
性能不如redis分布式锁,增加了列,增加维护成本,性能高于悲观锁

方案4:建防重复表(基于mysql的分布式锁,项目开发中常用)

流程图如下:
在这里插入图片描述

方案4说明
性能不如redis分布式锁,加了表,增加维护成本,在项目开发中常用,推荐使用

方案5:通过状态标识字段(与乐观锁性质差不多)

流程图同乐观锁

方案5说明
比如 订单的状态有1-下单 2-已支付 3-完成 4-撤销等状态
SQL-1:update set status=3 where id = 1 and status = 2

方案6:基于redis的分布式锁

流程图如下:
在这里插入图片描述

方案6说明
性能最好,如果并发过高,key过期时间过短或过长,会导致redis的负担很重;小并发场景推荐使用,太高的并发需要redis集群,推荐使用

四、小结

完整的幂等性, 除了后端外,前端也需要做防重复点击设计。


http://chatgpt.dhexx.cn/article/ogwy7XH3.shtml

相关文章

如何保证接口的幂等性?常见的实现方案有哪些?

什么是幂等性 幂等用于表示任意多次请求均与一次请求执行的结果相同,也就是说对于一个接口而言,无论调用了多少次,最终得到的结果都是一样的。 如何保证接口的幂等性 1、前端拦截 2、使用数据库实现幂等性 3、使用 JVM 锁实现幂等性 4、…

接口幂等性常见的解决方案

一、什么是接口幂等性? 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。 举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果的…

接口幂等性解决方案

一、分布式锁解决方案 先说这种方案,在网上有一些文章说可以通过分布式锁来保证幂等性。但是我认为这种方案不能保证幂等性,不可取。看下面分析 ①、方案流程介绍 用户通过浏览器发起请求,服务端接收请求数据,并且从请求数据中…

什么是接口的幂等性,如何实现接口幂等性?一文搞定

微信搜索《Java鱼仔》,每天一个知识点不错过 每天一个知识点 什么是接口的幂等性,如何实现接口幂等性? (一)幂等性概念 幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口&#x…

什么是幂等性?四种接口幂等性方案详解

幂等性在我们的工作中无处不在,无论是支付场景还是下订单等核心场景都会涉及,也是分布式系统最常遇见的问题,除此之外,也是大厂面试的重灾区。 知道了幂等性的重要性,下面我就详细介绍幂等性以及具体的解决方案&#…

接口的幂等性

1、接口调用存在的问题 现如今我们的系统大多拆分为分布式 SOA,或者微服务,一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用 RPC 通信或者 restful。既然是通信,…

如何保证接口的幂等性?

什么是幂等性?所谓幂等,就是任意多次执行所产生的影响均与一次执行的影响相同。 为什么会产生接口幂等性问题 在计算机应用中,可能遇到网络抖动,临时故障,或者服务调用失败,尤其是分布式系统中,接口调用…

什么是接口的幂等性以及如何实现接口幂等性

目录 1、接口调用存在的问题 2、什么是接口的幂等性 3、不做接口的幂等性会产生什么影响 4、什么情况下需要保证接口的幂等性 4.1 select:查询操作 4.2 insert:新增操作 4.3 delete:删除操作 4.3.1 绝对删除 具有幂等性 4.3.2 相对删…

Python安装pygame教程

Python安装pygame教程 1、版本说明 由于python3.8与pygame存在不兼容的问题,因此在下载Python的时候,需要下载python3.8以下版本的,我下载的是python3.7.5 2、具体步骤 1、在本机控制台通过命令安装pygame pip install pygame 出现错误 …

Pygame 教程(2):重要的概念及对象

本章,将介绍 Pygame 中的重要概念及对象。 导航 上一章:创建第一个应用程序 下一章:绘制图形 文章目录 导航像素坐标Rect 对象Color 对象Surface 对象实例:矩形生成器创建初始窗口创建生成矩形的函数调用函数完整代码 结语 像素…

Pygame教程系列二:MoviePy视频播放篇

【前言】 在pygame 2.0.0版本之前,播放视频可以使用pygame.movie.Movie(xxxx.mpg)播放(只支持.mpg格式的视频),但是在pygame 2.0.0之后,作者因为觉得视频模块维护成本太高就给抛弃了,假如你使用pygame 2.0.0,还调用上述…

Pygame 教程(4):图像传输和绘制文本

本章,你将学会如何传输图像和绘制文本。 导航 上一章:绘制图形 下一章:监测游戏时间 文章目录 导航加载图像导出图像绘制文本实例:画板添加常量限制坐标定义属性绘制色板更改线条粗细处理鼠标事件处理键盘事件调用事件处理方法完…

Pygame基础教程(一)

写在前面的话: 本系列教程仅有一些在本机调试通过的代码(如代码中发现bug,恳请包涵)。除代码中出现的一些主要注释外,不会出现太多其他文字解释,但是,文章中会给出主要模块的官方文档地址。再次…

Pygame 教程(5):监测游戏时间

本章,你将学习如何监测游戏时间。 导航 上一章:图像传输和绘制文本 下一章:努力更新中…… 文章目录 导航监测时间游戏帧速率实例:绘图性能对比结语 监测时间 在游戏程序中,时常需要随着时间的流逝而做出不同的动作…

Pygame教程系列四:播放音频篇

【前言】 pygame播放音频文件这部分相对来说比较简单,主要是用到pygame.mixer模块,不过也有一些地方需要注意的,咱们直接先看看案例 1、案例效果图 2、案例代码 import pygame from mutagen.mp3 import MP3 # 标识是否退出循环 exitFlag Fa…

python3.8安装pygame_Python3.8安装Pygame教程

注:因为最近想用一下Python做一些简单小游戏的开发作为项目练手之用,而Pygame模块里面提供了大量的有用的方法和属性。今天我们就在之前安装过PyCharm的基础上,安装Pygame,下面是安装的步骤,希望能够帮到大家。 第一步…

Pygame 教程(3):绘制图形

本章,你将学习如何在 Pygame 中绘制图形。 导航 上一章:重要的概念及对象 下一章:图像传输和绘制文本 文章目录 导航抗锯齿draw 模块实例:跟随鼠标的图形创建初始窗口添加变量捕捉鼠标事件绘制图形完整代码 结语 抗锯齿 抗锯齿…

Mac Pycharm导入Pygame教程(超细)

首先先新建一个想要使用Pygame的项目 进入项目后,点击文件(File)——新项目设置(settings) 点击新项目的偏好设置(Preferences for new project ) 随后可以看到 点击Python 编译器&#xff0…

mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame教程步骤详解

注:因为最近想用一下python做一些简单小游戏的开发作为项目练手之用,而Pygame模块里面提供了大量的有用的方法和属性。今天我们就在之前安装过PyCharm的基础上,安装Pygame,下面是安装的步骤,希望能够帮到大家。 第一步 安装Python和pip 如果已安装,使用python --version …

Pygame教程系列一:快速入门篇

【简介】 Pygame 是python用来开发视频游戏的游戏引擎,底层主要是SDL库实现,算是目前利用python开发小游戏的一个性能比较高的一个游戏框架 一、安装pygame 使用pip下载安装 pip install pygame二、入门案例详析 1、示例效果 2、示例代码 import os …