基于Redis&MySQL接口幂等性设计
基于Redis&MySQL接口幂等性设计
欲把相思说似谁,浅情人不知。
1、幂等
幂等性即多次调用接口或方法不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。
2、幂等使用场景
前端重复提交
用户注册、创建商品、提交订单、转账、支付等操作,前端都会提交一些数据给后台服务,后台需要根据用户提交的数据在数据库中创建记录。如果用户不小心多点了几次,后端收到了好几次提交,这时就会在数据库中重复创建了多条记录。这就是接口没有幂等性带来的bug。
接口超时重试
对于给第三方调用的接口,有可能会因为网络原因而调用失败,这种情况一般在设计的时候会对接口调用加上失败重试的机制,如果第一次调用已经执行了一半时发生了网络异常,这时再次调用时就会因为脏数据的存在而出现调用异常。
消息重复消费
在使用消息中间件来处理消息队列,且手动 ack 确认消息被正常消费时。如果消费者突然断开连接,那么已经执行了一半的消息会重新放回队列。
当消息被其他消费者重新消费时,如果没有幂等性,就会导致消息重复消费引起结果异常如数据库重复数据等。
3、解决方案
基于Token
通过token 机制实现接口的幂等性,是一种比较通用性的实现方法。

具体流程步骤:
客户端会先发送一个请求去获取 token,服务端会生成一个全局唯一的 ID 作为 token 保存在 redis 中,同时把这个 ID 返回给客户端;
客户端第二次调用业务请求的时候必须携带这个 token;
服务端会校验这个 token,如果校验成功,则执行业务,并删除 redis 中的 token;
如果校验失败,说明 redis 中已经没有对应的 token,则表示重复操作,直接返回指定的结果给客户端。
基于MySQL
基于MySQL实现方式是利用了 mysql 唯一索引的特性。

具体流程步骤:
建立一张去重表,其中某个字段需要建立唯一索引,如订单ID,用户ID;
客户端去请求服务端,服务端会将这次请求的一些信息插入这张去重表中;
因为表中某个字段带有唯一索引,如果插入成功,证明表中没有这次请求的信息,则执行后续的业务逻辑;
如果插入失败,则代表已经执行过当前请求,直接返回。
基于Redis
基于Redis是利用了 SETNX 命令实现的。

SETNX key value:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。
该命令在设置成功时返回 1,设置失败时返回 0。
具体流程步骤:
客户端先请求服务端,会拿到一个能代表这次请求业务的唯一字段;
将该字段以 SETNX 的方式存入 redis 中,并根据业务设置相应的超时时间;
如果设置成功,证明这是第一次请求,则执行后续的业务逻辑;
如果设置失败,则代表已经执行过当前请求,直接返回。
欲把相思说似谁
浅情人不知
基于Redis&MySQL接口幂等性设计的更多相关文章
- 防盗链&CSRF&API接口幂等性设计
防盗链技术 CSRF(模拟请求) 分析防止伪造Token请求攻击 互联网API接口幂等性设计 忘记密码漏洞分析 1.Http请求防盗链 什么是防盗链 比如A网站有一张图片,被B网站直接通过img标签属 ...
- 基于Redis的分布式锁设计
前言 基于Redis的分布式锁实现,原理很简单嘛:检测一下Key是否存在,不存在则Set Key,加锁成功,存在则加锁失败.对吗?这么简单吗? 如果你真这么想,那么你真的需要好好听我讲一下了.接下来, ...
- 基于Redis+MySQL+MongoDB存储架构应用
摘 要: Redis+MySQL+MongoDB技术架构实现了本项目中大数据存储和实时云计算的需求.使用MongoDB切片的水平动态添加,可在不中断平台业务系统的同时保障扩容后的查询速度和云计算效能 ...
- API接口幂等性设计
目录 幂等性场景 解决方案 幂等性场景 网络延迟导致多次重复提交. 表单重复提交. 解决方案 每次提交都使用一个Token,Token保证临时且唯一即可 token生成规则(单机应用):token+U ...
- Token+Redis实现接口幂等性
一.什么是 幂等性 在编程中,幂等性的特点就是其任意多次执行的效果和一次执行的效果所产生的影响是一样的. 二.Token+Redis的实现思路 1.数据提交前要向服务的申请 token(用户登录时可以 ...
- 基于Redis的短链接设计思路
[Markdown阅读][1] 今天上班的时候收到一个需要短链接的需求,之前的做法都是使用了新浪的短链接API(https://api.weibo.com/2/short_url/shorten.js ...
- 【分布式架构】--- 基于Redis组件的特性,实现一个分布式限流
分布式---基于Redis进行接口IP限流 场景 为了防止我们的接口被人恶意访问,比如有人通过JMeter工具频繁访问我们的接口,导致接口响应变慢甚至崩溃,所以我们需要对一些特定的接口进行IP限流,即 ...
- Python 基于python+mysql浅谈redis缓存设计与数据库关联数据处理
基于python+mysql浅谈redis缓存设计与数据库关联数据处理 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3 ...
- asp.net core mvc基于Redis实现分布式锁,C# WebApi接口防止高并发重复请求,分布式锁的接口幂等性实现
使用背景:在使用app或者pc网页时,可能由于网络原因,api接口可能被前端调用一个接口重复2次的情况,但是请求内容是一样的.这样在同一个短暂的时间内,就会有两个相同请求,而程序只希望处理第一个请求, ...
随机推荐
- 【LeetCode】800. Similar RGB Color 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...
- 【LeetCode】830. Positions of Large Groups 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- griffin环境搭建及功能测试
目录 1 准备 mysql hive hadoop spark livy es maven 配置环境变量 2 安装griffin 配置配置文件 编译 部署jar包 3 批处理测试 准确度度量 Accu ...
- isEmpty 和 isBlank
<org.apache.commons.lang3.StringUtils> isEmpty系列 StringUtils.isEmpty() ========> StringUtil ...
- rabbitmq集群和镜像队列
Rabbitmq集群和镜像队列 1引言 1.1编写目的 2 原理和使用 2.1镜像队列原理 2.1.1 原理 默认的一个rabbitmq中的queue是在一个node上的,至于在那个node上取决于c ...
- 应用TYPE-C外围电源管理IC IM2605
应用于TYPE-C外围集成同步4开关Buck-Boost变换器的电源管理IC IM2605 IM2605描述 IM2605集成了一个同步4开关Buck-Boost变换器,在输入电压小于或大于输出电 ...
- Linux下设置普通用户使用sudo命令
1.登录root用户 2.增加root用户对文件sudoers的写权限 chmod u+w /etc/sudoers 3.编辑sudoers,把用户mysql添加进去 vi /etc/sudoers ...
- Swoole 中使用 Lock 实现进程间锁
注意:不要在 lock 和 unlock 操作中间使用可能引起协程切换的 API. $lock = new Swoole\Lock(SWOOLE_MUTEX); echo "[Master] ...
- css 基础 rgba表示法
color:rgba(); //r表示red 红色 //g表示green 绿色 //b表示blue 蓝色 //a 表示透明度 color:rgb(0,0,0,0) //黑色 color:rgb(255 ...
- python @property用法(转载)
偶然碰到一篇讲解 @property 比较清晰的文章 记录下来 日常复习 # @property'''@property是python的一种装饰器,是用来修饰方法的 作用:我们可以使用@propert ...