Redis與自定義注解實現(xiàn)重復(fù)方式
更新時間:2025年12月11日 14:12:59 作者:筱筱木
文章介紹了如何使用Redis和自定義注解`SubmitLock`來防止重復(fù)提交,首先,創(chuàng)建了一個注解`SubmitLock`,然后在需要防止重復(fù)提交的方法上使用該注解,最后,通過一個controller測試驗證了該功能的有效性
1、創(chuàng)建 SubmitLock 注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SubmitLock {
String key() default "";
}2、注解實現(xiàn)
@Autowired
public RedisUtils redisUtils;
@Around("execution(* com.example.code_generation..*Controller.*(..)) && @annotation(lock)")
public Object submitInterceptor(ProceedingJoinPoint pjp, SubmitLock lock) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
String uri = request.getRequestURI();
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
//真實類名字
String targetName = pjp.getTarget().getClass().getName();
//真實方式
String methodName = pjp.getSignature().getName();
//所有的請求參數(shù)
Object[] arguments = pjp.getArgs();
Object[] args = new Object[arguments.length];
SubmitLock localLock = method.getAnnotation(SubmitLock.class);
String key = setKey(localLock.key(), pjp.getArgs());
if (!StringUtils.isEmpty(key)) {
if (redisUtils.get(key) != null) {
log.error("請勿重復(fù)操作,uri = 【{}】", uri);
return new RspData<>(BizCodeEnum.WARN, "請勿重復(fù)操作");
}
redisUtils.set(key,key,2);
}
Object result = null;
try {
result = pjp.proceed();
return result;
}catch (Throwable throwable){
throw new RuntimeException("服務(wù)器異常");
}finally {
int order = 0;
for (Object arg : arguments){
if (arg instanceof ServletRequest || arg instanceof ServletResponse || arg instanceof MultipartFile){
continue;
}
args[order] = arg;
order ++ ;
}
log.info("調(diào)用Controller方法返回結(jié)果,targetName = {}, methodName = {}, args = {}, result = {}",
targetName, methodName, args, result);
}
}
private String setKey(String keyExpress, Object[] args) {
if (null != args && args.length > 0) {
keyExpress = keyExpress.replace("arg[0]", args[0].toString());
}
return keyExpress;
}
3、controller 測試驗證
@SubmitLock(key = "getTest")
@ApiOperation(value = "獲取代辦任務(wù)")
@GetMapping("getTest")
public Object getTest(@CurrentUser UserInfo userInfo) {
}總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:
相關(guān)文章
Redis中big?keys發(fā)現(xiàn)與解決過程
文章從bigkeys的定義、產(chǎn)生原因、危害、如何發(fā)現(xiàn)以及處理方法等方面詳細(xì)介紹了Redis中bigkeys的問題,bigkeys會導(dǎo)致請求響應(yīng)慢、網(wǎng)絡(luò)卡頓、數(shù)據(jù)丟失等問題,需要通過異步刪除、拆分key等方法進行處理2026-04-04
Redis超詳細(xì)講解高可用主從復(fù)制基礎(chǔ)與哨兵模式方案
Redis因為其高性能和易用性在我們后端的服務(wù)中發(fā)揮了巨大的作用,并且很多重要功能的實現(xiàn)都會依賴redis,本篇我們來了解Redis高可用主從復(fù)制與哨兵模式2022-04-04

