幂等性组件

article/2025/9/25 10:17:08

根据上篇文章改进,并做成springbootstarter,依赖于redisson,如果redission已配置,则该组件可开箱即用

接口防重复提交_King_Kwin的博客-CSDN博客_接口防重复提交

本篇已做了较大的改动,可查看代码

idempotent: 幂等性组件,springboot-starter形式,项目依赖redission组件

本组件可通过Idempotent注解使用,注解如下:

package com.kwin.idempotent.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;/*** 幂等或防重复提交* @author kwin* @Date 2022/3/24 15:11**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {/*** 幂等的key,不设置则取所有参数toString* spel表达式,支持多项拼接* @return*/String[] keys() default {};/*** keys的分隔符* @return*/String split() default "-";/*** 锁过期时间* @return*/int timeout() default 5;/*** 锁过期时间单位* @return*/TimeUnit timeUnit() default TimeUnit.SECONDS;/*** 锁的位置,不设置则取URI*/String location() default "";/*** 提醒信息* @return*/String info() default "操作过于频繁,请稍后重试";/*** 执行完成后是否释放key* @return*/boolean delKey() default false;
}

作者的测试demo

首先创建一个springboot项目

项目配置application.yml

redisson:address: redis://***:6379database: 1password: 111

redisson参数配置类

package com.example.testidempotent.config;import lombok.Data;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;/*** @author kwin* @Date 2022/1/16 18:12**/
@Data
@Configuration
@ConfigurationProperties(prefix = "redisson")
@ConditionalOnProperty("redisson.password")
public class RedissonProperties {private int timeout = 3000;private String address;private String password;private int database = 0;private int connectionPoolSize = 64;private int connectionMinimumIdleSize=10;private int slaveConnectionPoolSize = 250;private int masterConnectionPoolSize = 250;private String[] sentinelAddresses;private String masterName;
}

redisson配置类

package com.example.testidempotent.config;import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;import javax.annotation.Resource;/*** @author kwin* @Date 2022/1/16 18:14**/
@Configuration
@ConditionalOnClass(Config.class)
//@EnableConfigurationProperties(RedissonProperties.class)
public class RedissonAutoConfiguration {@Resourceprivate RedissonProperties redssionProperties;/*** 哨兵模式自动装配* @return*/
/*    @Bean@ConditionalOnProperty(name="redisson.master-name")RedissonClient redissonSentinel() {Config config = new Config();SentinelServersConfig serverConfig = config.useSentinelServers().addSentinelAddress(redssionProperties.getSentinelAddresses()).setMasterName(redssionProperties.getMasterName()).setTimeout(redssionProperties.getTimeout()).setMasterConnectionPoolSize(redssionProperties.getMasterConnectionPoolSize()).setSlaveConnectionPoolSize(redssionProperties.getSlaveConnectionPoolSize());if(StringUtils.hasText(redssionProperties.getPassword())) {serverConfig.setPassword(redssionProperties.getPassword());}return Redisson.create(config);}*//*** 单机模式自动装配* @return*/@Bean@ConditionalOnProperty(name="redisson.address")RedissonClient redissonSingle() {Config config = new Config();SingleServerConfig serverConfig = config.useSingleServer().setAddress(redssionProperties.getAddress()).setTimeout(redssionProperties.getTimeout()).setConnectionPoolSize(redssionProperties.getConnectionPoolSize()).setConnectionMinimumIdleSize(redssionProperties.getConnectionMinimumIdleSize());if(StringUtils.hasText(redssionProperties.getPassword())) {serverConfig.setPassword(redssionProperties.getPassword());}return Redisson.create(config);}
}

通用异常处理(用于展示重复提交的消息提示)

package com.example.testidempotent.config;import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** @author kwin* @Date 2022/4/7 16:00**/
@RestControllerAdvice
public class CommonExceptionHandler {@ExceptionHandler(value = Exception.class)public String exceptionHandler(Exception e) {return e.getMessage();}
}

引入已经打包好的Idempotent组件

        <dependency><groupId>com.kwin</groupId><artifactId>idempotent</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

controller接口(可看到:使用Idempotent注解即可)

package com.example.testidempotent.controller;import com.kwin.idempotent.annotation.Idempotent;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** @author kwin* @Date 2022/4/7 15:16**/
@RestController
public class TestController {@Idempotent(keys = "#a")@GetMapping("/test")public String test(@RequestParam("a") String a) {return a;}
}

测试结果

连续点击时

 

 


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

相关文章

java幂等控制_JAVA幂等性实现

什么是幂等&#xff1a; 贴一张百度百科的图&#xff1a; 简单来说幂等保证了只要调用接口成功,外部多次调用对系统的影响是一致的&#xff0c;也就是一个请求多次重试的问题。 需要考虑幂等的场景&#xff1a; 客户端存在多次提交或者超时重试的情况&#xff1b; 分布式架构中…

幂等问题

点击↑上方↑蓝色“编了个程”关注我~ 每周至少一篇原创文章 这是本公众号的第 34 篇原创文章 最近比较懒&#xff0c;好几周没写文章了。还是没能坚持每周更新&#xff0c;愧对关注我的读者和自己的flag。。。 不过还好调整了过来&#xff0c;还是会继续坚持周更的。毕竟学习是…

常见的幂等性解决方案

背景 我们实际系统中有很多操作&#xff0c;是不管做多少次&#xff0c;都应该产生一样的效果或返回一样的结果。 get请求一般没有幂等性需求、delete请求一般也没有幂等性需求&#xff0c;post、update视情况而定例如&#xff1a; 前端重复提交选中的数据&#xff0c;应该后…

彻底理解接口幂等性

目录 背景 1. 幂等性的概念 2.什么情况需要处理接口幂等性问题&#xff1f; 2.1 select 天然自带幂等性。 2.2 insert 当我们重复插入数据的时候&#xff0c;会出现什么情况 &#xff1f; 2.3 delete 是否具有幂等性&#xff1f; 2.4 update 猜一猜是否具有天热幂等性&a…

【实战】聊聊幂等设计

前言 大家好,今天我们一起来聊聊幂等设计。 什么是幂等为什么需要幂等接口超时,如何处理呢?如何设计幂等?实现幂等的8种方案HTTP的幂等1. 什么是幂等? 幂等是一个数学与计算机科学概念。 在数学中,幂等用函数表达式就是:f(x) = f(f(x))。比如求绝对值的函数,就是幂等…

幂等性 详解

目录 一、幂等概念 1、幂等的数学概念 2. 幂等的业务概念 二、幂等概述 三、幂等场景 四、解决方案 1、token redis机制 2、乐观锁机制 3、唯一主键机制 4、去重表机制 5、门票机制 一、幂等概念 1、幂等的数学概念 如果在一元运算中&#xff0c;x 为某集合中的任…

幂等 (idempotence) 的概念

幂等 (idempotence) 的概念 幂等的数学概念 幂等是源于一种数学概念。其主要有两个定义 如果在一元运算中&#xff0c;x 为某集合中的任意数&#xff0c;如果满足 f(x) f(f(x)) &#xff0c;那么该 f 运算具有幂等性&#xff0c;比如绝对值运算 abs(a) abs(abs(a)) 就是幂…

偏度

偏度公式如下&#xff1a; 现在想解决如何从图像上解决为正为负的问题&#xff0c;如图所示&#xff1a; 个人理解&#xff1a;偏度中的偏是针对变量相对于中心点&#xff08;期望值&#xff09;距离的一种描述&#xff1b;如果厚尾的话&#xff0c;就说明有很多点距离中心点比…

偏度(skewness)

偏度 偏度&#xff08;skewness&#xff09;&#xff0c;是统计数据分布偏斜方向和程度的度量&#xff0c;是统计数据分布非对称程度的数字特征。定义上偏度是样本的三阶标准化矩。 偏度定义中包括正态分布&#xff08;偏度0&#xff09; 算术平均值 中位数 众数&#xff0c;…

策略梯度

Policy Gradient Methods for Reinforcement Learning with Function Approximation(PG) 在强化学习的算法中存在两种算法&#xff0c;一个是基于价值函数的算法&#xff0c;另一个是基于策略梯度的算法。为什么要提出策略梯度算法呢&#xff1f; 基于策略的学习可能会具有更好…

推荐系统中的偏差

推荐系统消偏 推荐系统中的偏差IPW ——逆概率加权DICE ——区分兴趣和偏差建模因果推断 推荐系统中的偏差 预估问题 我们一般会注重两种误差&#xff0c;偏差和方差&#xff0c; 方差与模型泛化能力有关&#xff1a;通常关注模型的复杂度与是否过拟合&#xff1b;偏差则表现为…

特征偏度和异常值处理

&#xff08;一&#xff09;机器学习基础 - 偏度、正态化以及 Box-Cox 变换 https://my.oschina.net/mathinside/blog/4942126 对于数据挖掘、机器学习中的很多算法&#xff0c;往往会假设变量服从正态分布。例如&#xff0c;在许多统计技术中&#xff0c;假定误差是正态分布…

推荐系统去偏(Debiased Recommendation)研究进展概述

©作者 | 张景森 学校 | 中国人民大学信息学院硕士 文章来源 | RUC AI Box 引言 推荐系统作为解决信息过载的一种重要手段&#xff0c;已经在不同的应用场景下取得了不错的效果。近些年来关于推荐系统的研究主要集中在如何设计更好的模型来适应用户行为数据&#xff0c;进而…

【综述】推荐系统偏差问题 去偏最新研究进展(Bias and Debias in Recommender System)

文章目录 1. 推荐系统的反馈回路1.1 User -> Data1.2 Data -> Model1.3 Model -> User 2. 推荐系统中的Bias2.1 数据偏差(data bias)2.1.1 选择偏差(Selection Bias)2.1.2 曝光偏差(Exposure Bias)2.1.3 一致性偏差(Conformity Bias)2.1.4 位置偏差(Position Bias) 2.…

数据偏度介绍和处理方法

偏度&#xff08;skewness&#xff09;是用来衡量概率分布或数据集中不对称程度的统计量。它描述了数据分布的尾部&#xff08;tail&#xff09;在平均值的哪一侧更重或更长。偏度可以帮助我们了解数据的偏斜性质&#xff0c;即数据相对于平均值的分布情况。 有时&#xff0c;正…

【期权系列】基于偏度指数的择时分析

【期权衍生指标系列】基于偏度指数的择时分析 本篇文章是基于研究报告的复现作品&#xff0c;旨在记录个人的学习过程和复现过程中的一些思路。 感谢中信期货研究员前辈的宝贵思路。 一、偏度指数 1.偏度指数简介 偏度是描述数据分布形态的统计量&#xff0c;其描述的是统…

对于偏度的理解

偏度公式如下&#xff1a; 现在想解决如何从图像上解决为正为负的问题&#xff0c;如图所示&#xff1a;&#xff1f; 个人理解&#xff1a;偏度中的偏是针对变量相对于中心点&#xff08;期望值&#xff09;距离的一种描述&#xff1b;如果厚尾的话&#xff0c;就说明有很多点…

量化策略研究:股票中的偏度效应

2022年4月份以来&#xff0c;加密货币市场的暴跌强调了市场中性策略的重要性&#xff1b;基于此&#xff0c;有部分Quanter提出了基于加密货币的偏度策略&#xff1a;“Skewness/Lottery Trading Strategy in Cryptocurrencies”。 为此&#xff0c;小编不禁好奇&#xff1a;偏…

Maven安装和配置(详细版)

Maven安装和配置 Maven安装1、安装链接&#xff1a;2、配置环境变量&#xff1a; Maven配置1、修改Maven仓库下载镜像及修改仓库位置&#xff1a;2、在Idea上配置Maven&#xff1a; 测试Maven安装能否安装jar包 Maven安装 1、安装链接&#xff1a; Maven – Download Apache …

Maven 安装/学习入门详解!

Maven安装&#xff1a; Maven 软件的下载 为了使用 Maven 管理工具&#xff0c;我们首先要到官网去下载它的安装软件。通过百度搜索“Maven 点击 Download 链接&#xff0c;就可以直接进入到 Maven 软件的下载页面&#xff1a; 我们当时使用的是 apache-maven-3.5.2 版本&a…