springboot redis token_Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验

优质文章,及时送达

RcsUnd92eoboDR

作者 | wangzaiplus

链接 | www.jianshu.com/p/6189275403ed

一、概念

幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次

比如:

  • 订单接口, 不能多次创建订单

  • 支付接口, 重复支付同一笔订单只能扣一次钱

  • 支付宝回调接口, 可能会多次回调, 必须处理重复回调

  • 普通表单提交接口, 因为网络超时等原因多次点击提交, 只能成功一次

    等等

二、常见解决方案

  • 唯一索引 -- 防止新增脏数据

  • token机制 -- 防止页面重复提交

  • 悲观锁 -- 获取数据的时候加锁(锁表或锁行)

  • 乐观锁 -- 基于版本号version实现, 在更新数据那一刻校验数据

  • 分布式锁 -- redis(jedis、redisson)或zookeeper实现

  • 状态机 -- 状态变更, 更新数据时判断状态

三、本文实现

本文采用第2种方式实现, 即通过redis + token机制实现接口幂等性校验

四、实现思路

为需要保证幂等性的每一次请求创建一个唯一标识token, 先获取token, 并将此token存入redis, 请求接口时, 将此token放到header或者作为请求参数请求接口, 后端接口判断redis中是否存在此token:

  • 如果存在, 正常处理业务逻辑, 并从redis中删除此token, 那么, 如果是重复请求, 由于token已被删除, 则不能通过校验, 返回请勿重复操作提示

  • 如果不存在, 说明参数不合法或者是重复请求, 返回提示即可

五、项目简介

  • springboot

  • redis

  • @ApiIdempotent注解 + 拦截器对请求进行拦截

  • @ControllerAdvice全局异常处理

  • 压测工具: jmeter

说明:

本文重点介绍幂等性核心实现, 关于springboot如何集成redis、ServerResponse、ResponseCode等细枝末节不在本文讨论范围之内, 有兴趣的小伙伴可以查看我的Github项目:

https://github.com/wangzaiplus/springboot/tree/wxw

六、代码实现

pom

redis.clients

jedis

2.9.0

org.projectlombok

lombok

1.16.10

JedisUtil

@Component

@Slf4j

public classJedisUtil{

@Autowired

private JedisPool jedisPool;

private Jedis getJedis {

return jedisPool.getResource;

}

/**

* 设值

*

* @param key

* @param value

* @return

*/

public String set(String key, String value) {

Jedis jedis = ;

try {

jedis = getJedis;

return jedis.set(key, value);

} catch (Exception e) {

log.error("set key:{} value:{} error

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

语言代号/地区代号/国家代号

国家/地区语言代码简体中文(中国)zh-cn繁体中文(台湾地区)zh-tw繁体中文(香港)zh-hk英语(香港)en-hk英语(美国)en-us英语(英国)en-gb英语(全球)en-ww英语(加拿大)en-ca英语(澳大利亚)en-au英语(爱尔兰)en-ie英语(芬兰)en-fi芬兰语(芬兰)fi-fi英语(丹麦)en-dk丹麦语(丹麦)da-dk英…

java 示例_功能Java示例 第2部分–讲故事

java 示例这是称为“ Functional Java by Example”的系列文章的第2部分。 我在本系列的每个部分中开发的示例是某种“提要处理程序”,用于处理文档。 在上一部分中,我从一些原始代码开始,并应用了一些重构来描述“什么”而不是“如何”。 …

python如何读取文件内容求和_使用python对文件中的数值进行累加的实例

问题描述: 一个文件由若干条记录组成,记录的格式为:“num1 num2”,有时候,需要统计文件中num1对应的num2的总值。 处理问题的思路 用传说中的python来处理,很方便。几行代码就可以了。 处理思路&#xff1a…

基2FFT算法matlab程序编写,频率抽取(DIF)基2FFT算法的MATLAB实现

频率抽取(DIF)基2FFT算法和时间抽取(DIT)基2FFT算法是两种等价的FFT算法,其相同之处:(1)DIF与DIT两种算法均为原位运算。(2)DIF与DIT运算量相同。不同之处:(1)DIF的算法结构是将DIT算法结构倒过来。 DIF为输入顺序,输出乱序。运算…

Linux 命令之 localectl -- 控制系统的本地化与键盘布局

文章目录命令介绍常用选项参考示例(一)显示当前的本地化设置与键盘映射(二)设置系统的本地化字符集环境变量(三)列出本地所有字符集(四)列出所有可用的控制台键盘映射(五…

Linux 命令之 locale -- 设置和显示程序运行的语言环境

文章目录命令介绍locale 设置规则使用详解(一)查看当前 locale 设置(二)查看当前系统所有可用 locale(三)设置系统的 locale命令介绍 locale 是 Linux 系统中多语言环境的设置接口,在 Linux 中…

python range函数范围_Python range函数

Python range函数教程 range函数详解 语法 range(start, stop[, step]) 参数 参数 描述 start 计数从 start 开始。默认是从 0 开始。 stop 计数到 stop 结束,但不包括 stop。 step 步长,默认为1,可以支持负数。 返回值 返回生成的序列。 案例…

php sapi globals,PhP 常见安装错误

ext/iconv/.libs/iconv.o: In function php_iconv_stream_filter_ctor’:/home/king/php-5.2.13/ext/iconv/iconv.c:2491: undefined reference to libiconv_open’collect2: ld returned 1 exit statusmake: *** [sapi/cli/php] Error 1[roottest php-5.2.13]# vi Makefile在安…

openpyxl删除添加excel列_Python | 如何使用Python操作Excel(二)

0 前言在阅读本文之前,请确保您已满足或可能满足一下条件:请确保您具备基本的Python编程能力。请确保您会使用Excel。请确保您的电脑已经安装好Python且pip可用。请确保您已经读过前文:如何使用Python操作Excel(一)LogicPanda,公众…

Linux 命令之 timedatectl -- 查看系统当前时区设置

timedatectl命令用于查看当前时区设置。 # 查看当前时区设置 $ timedatectl# 显示所有可用的时区 $ timedatectl list-timezones # 设置当前时区 $ sudo timedatectl set-timezone Americ…

payara 创建 集群_使用Payara Micro的Easy Java EE Microservices

payara 创建 集群想知道如何开始使用Java EE Microservices? 使用Java EE API部署微服务只需要几个快速步骤。 许多人认为Java EE对于与微服务一起使用而言过于繁重,但事实并非如此……尤其是如果您仅利用服务所需的Java EE规范。 在这篇简短的文章中&am…

php导出页面居中设置,PHPExcel导出插入图片和居中问题

首先到网上先下载PHPExcel下载后解压得到这两个文件下载后引用该文件最后编写相关代码:首先是图片插入导出$objDrawing new PHPExcel_Worksheet_Drawing();$objDrawing->setName(‘Photo‘);$objDrawing->setDescription(‘Photo‘);$objDrawing->setPath…

Linux 命令之 loginctl -- 查看系统当前登录的用户

# 列出当前session $ loginctl list-sessions# 列出当前登录用户 $ loginctl list-users# 列出显示指定用户的信息 $ loginctl show-user ruanyf

两台电脑通过usb共享网络_怎样让电脑通过手机共享上网?

手头有部七年前买的安卓智能手机已经不用了,卖掉不值钱,放在家里也是浪费。能否让它继续发挥余热呢?最近找到了一个好办法,就是可以让个人电脑通过它来上网(如下图所示):1. 用数据线将电脑与手机…

有效期判断功能 java_有效的Java第三版有哪些新功能?

有效期判断功能 java自从听说即将出版的有效Java 第三版以来,我一直想知道其中有什么新内容。 我假设将涵盖自Java 6以来引入Java的功能,的确如此。 但是,第三版Java开发人员经典版也有一些其他更改。 在本文中,我提供了有关在第三…

Linux 命令之 touch -- 创建文件

文章目录命令介绍常用选项命令示例(一)创建空文件(二)批量创建文件(三)修改文件的访问时间命令介绍 touch 命令有两个功能:一是用于把已存在文件的时间戳更新为系统当前的时间(默认…

linux redis客户端_你见过能把Redis的主从复制讲这么明白的吗?

概念1.Conception(概念)Redis的复制也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。2.Function(功能)读写分离(秉持与RDBMS 相同的设计理念)容灾恢复R…

lombok 简化代码_如何编写更少,更好的代码,或Project Lombok

lombok 简化代码我长期以来一直打算写有关Lombok的文章 ,以至于每当一个自重的Java开发人员都已经听说过它时,我可能会写它。 尽管如此,值得一提的是,如果只是提醒自己,不要犹豫,尝试性能增强工具并查看它们…

discuz3.1用哪个版本php版本好,Discuz应用中心安装模板提示版本号不匹配适用于X3.3 X3.2 X3.1的解决方法...

有时候我们从应用中心安装模板,在应用中心里模板作者设定允许我们的程序版本,但是我们安装时却提示版本号不匹配,那这是为什么呢?经过我们分析发现是因为X3和X3.1,X3.2的模板是完全兼容的,很多模板是在X3的…

Linux 系统服务管理器(初始化系统/init system) -- systemd 及命令 systemctl 的详细介绍

文章目录一、系统服务管理器 systemd(一)systemd 的特性(二)systemd 与 传统 init 系统的区别(三)systemd 的目录和文件(四)systemd 的 Unit 介绍1.Unit 类型2.Unit 的配置文件&…