接口幂等性

接口幂等性

  • 如何实现幂等性
    • 实现方式一:数据库唯一主键
    • 实现方式二:Token机制
    • 实现方式三:数据库乐观锁
    • 实现方式四、加分布式锁

如何实现幂等性

其实实现幂等性的方案有不少,但是呢,这就得需要你根据不同的业务场景去选择合适的方式了。

实现方式一:数据库唯一主键

加唯一索引可以保证同时有多个请求过来的时候只有一个请求可以执行插入操作,因为当一个请求已经插入了数据之后,其他请求再去插入数据的时候因为有唯一索引所以就会报错。为了保证幂等性,如果一个请求得到的结果是报错的话,我们后端要对这种异常进行处理来保证给前端返回的结果是请求成功,因为要保证多次请求返回的结果是一样的。

但是唯一索引的添加也是一个技术活,如果我们对一个单一的字段设置为唯一索引的话,如果你的这 个业务场景中以进行数据的真正删除的话那么这么设计是没有问题的,但是如果你的业务中要求你的数据不能真正的删除而是需要进行留档,用户的删除只是进行逻辑删除的话,我们设计的单一的字段为唯一索引的话,那么我们插入新数据的时候就会出现唯一索引冲突的问题了。

那么对于这种业务场景我们就要采用符合索引了,也就是将多个字段作为唯一索引,比如我们将 order_id和is_delete字段作为一个唯一索引。但是这种设计也是有问题的,比如如果我们的系统中的逻辑删除字段(is_delete)的值只有0和1,0代表没有删除,1代表删除了,那么这样的话,我们再插入新的数据的时候还是可能会出现唯一索引冲突的。那么解决这个问题的方案是什么呢?那就是我们可以扩大 is_delete字段的值,比如如果这个字段已经删除了,我们将is_delete的值设置为这一行数据的唯一主键id, 如果没有删除的话就是0.那么这样的话就不会出现唯一索引冲突了。

加唯一索引的流程图:
在这里插入图片描述

实现方式二:Token机制

Token机制,实际上也可以称为 Token 令牌

  1. 服务端提供了发送token的接⼝。我们在分析业务的时候,哪些业务是存在幂等问题的,就必须在 执⾏业务前,先去获取token,服务器会把token保存到redis中。(微服务肯定是分布式了,如果 单机就适⽤jvm缓存)。
  2. 然后调⽤业务接⼝请求时,把token携带过去,⼀般放在请求头部。
  3. 服务器判断token是否存在redis中,存在表示第⼀次请求,这时把redis中的token删除,继续执⾏业务。
  4. 如果判断token不存在redis中,就表示是重复操作,直接返回重复标记给client,这样就保证了业务代码,不被重复执⾏。

在这里插入图片描述

实现方式三:数据库乐观锁

使用乐观锁的话,我们需要在数据库中设计一个用来作为版本号的字段,比如增加一个timeStamp或 者version字段来作为数据库的字段,我们在每次更新操作的时候会判断这个版本号,只有版本号是一致的才可以进行更新,否则是无法进行更新的。

比如下面的sql流程

#1.查询我们要操作的数据,获得当前这行数据的版本号
select id,money,version from user where id=1;
#2.根据第一步获得的版本号来进行更新操作。
update user set money=money-100,version=version+1 where id=1 and version=1;

如果此时返回的结果是1说明操作成功了,如果返回的数据是0的话,说明当前这个请求没有进行处 理。通过这个乐观锁保证了多个请求同时过来的时候只有一个请求可以执行。同时为了保证幂等性,如果返回的结果是0的话,我们也要返回成功的结果,因为幂等性要保证多次请求返回的结果是相同的。

实现方式四、加分布式锁

现在比较常用的分布式锁的框架就是Redis和zookeeper了。下面我来说一下redis中的方法。

  1. setnx命令
  2. set命令
  3. redisson

多个请求过来的时候我们只让第一个请求可以设置key,并且给这个key设置一个过期时间,后面再过来的请求发现已经有这个key了就无法设置key了。所以成功设置了key的请求就是成功执行的那个请求,后面没有成功设置key的请求就是没有成功执行的请求,但是我们还是要给前端返回成功的结果,因为要保证幂等性。
zookeeper的解决方案的话,使用Curator框架就可以了。
分布式锁方案的流程图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/377178.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 目前还没有一个好的皮克斯迪士尼风格的卡通模型,所以我决定自己制作一个。这是将皮克斯风格模型与我自己的Loras合并在一起,创建一个通用的…

oracle 启动命令以及ORA-01033问题处理、删除归档日志

1 启动数据库:startup 2 关闭数据库:Shutdown immediate 3 查看监听状态:lsnrctl status 4 启动监听:lsnrctl start 5 停止监听:lsnrctl stop 常见问题 1、在服务器重启后会出现,Oracle ORA-01033: ORAC…

渗透测试-信息打点与架构分析细节梳理

渗透测试-信息打点与架构分析细节梳理 为了保障信息安全,我在正文中会去除除靶场环境的其他任何可能的敏感信息 什么是网站架构 网站架构包括网站的方方面面,下面是常见的内容: 前端(Front-End): 使用Reac…

DAY14之二叉树理论基础及递归遍历和迭代遍历

理论基础 满二叉树 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 如图所示: 这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉…

Pymysql之Connection中常用API

Connection中常用API 1、open() :检测数据库是否连接。 connect.open:如果数据库连接返回Trhe,否则返回False。 2、ping(reconnectTrue) connect.ping(reconnectTrue):如果reconnectTrue表示连接断开后,重新进行连接。 import…

春节假期如何高效管理Shopee虾皮本土店?技巧都给你整理好了!

EasyBoss ERP 对于中国人最重要的春节即将来临,但对于运营Shopee、TikTok Shop等平台的卖家而言,他们的客户可不会过春节。为了不影响店铺的业绩,很多卖家在春节期间都还是照常运营店铺,但又不想错过和家人团圆的机会怎么办&…

《Java程序设计》实验报告(一)之Java语言基础

实验内容及步骤: 编写”hello world”应用程序。(1)代码: public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } (2)运行…

惟客数据地产经营分析解决方案-构建数字化经营体系,提高精细化管理能力

惟客数据地产经营分析解决方案以拉通数据底座,以管理行为、量化考核、预警机制为核心,强化对经营风险的识别和解决,以终为始,通过高频高价值场景的应用适配,支撑企业在数字化时代中不断创新、转型,提升企业…

使用Pillow来生成简单的红包封面

Pillow库(Python Imaging Library的后继)是一个强大而灵活的图像处理库,适用于Python。Pillow 库(有时也称 PIL 库) 是 Python 图像处理的基础库,它是一个免费开源的第三方库,由一群 Python 社区…

SSL协议是什么?关于SSL和TLS的常见问题解答

SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些相关技术称为“SSL”或“SSL/TLS”。那么…

VM 虚拟机和容器技术之间有什么区别?

随着云计算技术的不断发展,虚拟机和容器技术作为两种常见的虚拟化技术,被广泛应用于云计算领域。虽然虚拟机和容器技术都是虚拟化技术,但它们之间存在一些重要的区别。本文将详细介绍虚拟机和容器技术的区别,以便读者更好地了解这…

2.7:二叉树创建、先中后遍历、各个节点度的个数、深度

1.二叉树的创建、先中后遍历、各个节点度的个数、深度 程序代码&#xff1a; 1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 typedef char datatype;5 typedef struct node6 {7 datatype data;8 struct node *lchild;9 struct…

如何使用数据恢复软件恢复已删除的数据

本教程介绍如何使用奇客数据恢复软件有效地从各种存储系统中恢复已删除的数据&#xff1a; 您是否曾经不小心从系统中删除了数周或数月的工作成果&#xff1f; 如果是这样&#xff0c;那么请从您并不孤单这一事实中找到安慰。这种严重且后果严重的判断错误在世界各地的计算机…

【leetcode】深搜、暴搜、回溯、剪枝(C++)1

深搜、暴搜、回溯、剪枝&#xff08;C&#xff09;1 一、全排列1、题目描述2、代码3、解析 二、子集1、题目描述2、代码3、解析 三、找出所有子集的异或总和再求和1、题目描述2、代码3、解析 四、全排列II1、题目解析2、代码3、解析 五、电话号码的字母组合1、题目描述2、代码3…

21.HarmonyOS App(JAVA)自适应布局Layout使用方法

AdaptiveBoxLayout是鸿蒙操作系统中最具有特色的布局&#xff0c;可以方便开发者对组件的自适应排布。 AdaptiveBoxLayout是自适应盒子布局&#xff0c;该布局提供了在不同屏幕尺寸设备上的自适应布局能力&#xff0c;主要用于相同级别的多个组件需要在不同屏幕尺寸设备上自动调…

LLM(5) | Encoder 和 Decoder 架构

LLM(5) | Encoder 和 Decoder 架构 文章目录 LLM(5) | Encoder 和 Decoder 架构0. 目的1. 概要2. encoder 和 decoder 风格的 transformer (Encoder- And Decoder-Style Transformers)原始的 transformer (The original transformer)编码器 (Encoders)解码器 (Decoders)编码器和…

2024三掌柜赠书活动第九期:Node.js从基础到项目实践(视频教学版)

目录 前言Node.js从基础到项目实践关于《Node.js从基础到项目实践(视频教学版)》编辑推荐内容简介作者简介图书目录书中前言/序言《Node.js从基础到项目实践(视频教学版)》全书速览结束语 前言 随着Web应用的快速发展&#xff0c;Node.js作为一种强大的JavaScript运行时环境&…

前端-Vue項目初始化

大家好我是苏麟 , 今天聊聊前端依赖 Ant Design Vue 快速初始化项目 . Ant Design Vue官网 : 快速上手 - Ant Design Vue (antdv.com) 初始化项目 找到文档->快速上手 脚手架命令 : npm install -g vue/cli 找到一个文件夹(不要在中文路径) 下打开cmd窗口输入脚手架命令 成…

Flink实战六_直播礼物统计

接上文&#xff1a;Flink实战五_状态机制 1、需求背景 现在网络直播平台非常火爆&#xff0c;在斗鱼这样的网络直播间&#xff0c;经常可以看到这样的总榜排名&#xff0c;体现了主播的人气值。 人气值计算规则&#xff1a;用户发送1条弹幕互动&#xff0c;赠送1个荧光棒免费…

Mac电脑清空特别大型旧文件如何一键清理?

在我们的数字生活中&#xff0c;Mac电脑常常承载着大量个人资料和重要文件。但当我们决定把自己的Mac送给亲人或朋友使用时&#xff0c;面临的首要任务便是彻底且高效地清空所有个人数据&#xff0c;以保证隐私安全。传统的删除方法虽然简单&#xff0c;但往往不能彻底清除所有…