欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > redis实现接口幂等性限流

redis实现接口幂等性限流

2025/5/11 19:27:45 来源:https://blog.csdn.net/wyh2943455568/article/details/143466497  浏览:    关键词:redis实现接口幂等性限流

消息的幂等性(Idempotency of messages)是指在分布式系统中,某个操作无论执行多少次,都会产生相同的结果,而不会因重复执行而导致副作用或不一致的状态。幂等性在消息传递、事务处理和分布式系统中非常重要,确保系统在面对重复请求或消息时仍能保持数据的一致性和正确性。

为什么需要幂等性

  1. 网络不稳定:在分布式系统中,网络的不稳定性可能导致消息重复发送或接收。

  2. 服务故障重试:为了提高系统的可靠性,通常会对某些操作进行重试,如果这些操作不是幂等的,可能会导致数据的重复处理。

  3. 消息队列:在使用消息队列时,由于消费端的故障或其他原因,可能会导致消息被重复消费。

实现幂等性的方法

  1. 唯一标识:为每个请求生成唯一标识(如UUID、全局唯一ID),并在服务器端记录该标识。每次处理请求时,先检查该标识是否已处理过,如果已处理则忽略当前请求。

  2. 数据库约束:利用数据库的唯一约束,确保某些操作不会被重复执行。例如,在插入数据时,可以使用唯一索引避免重复插入。

  3. 版本号:在更新操作中,使用乐观锁或版本号机制,确保同一数据不会被重复或并发修改。

  4. 状态检查:在处理操作前,先检查系统当前状态,如果状态已经是目标状态,则直接返回成功。

Aop,redis实现幂等性

切面类

@Aspect
@Component
public class IdemAspect {private final RedisTemplate redisTemplate;public IdemAspect(RedisTemplate redisTemplate) {this.redisTemplate = redisTemplate;}//在方法前置通知设置切入点//只有@annotation(idemAnnotation)注解标注的方法才实现@Before(value = "@annotation(idemAnnotation)")public void before(JoinPoint joinPoint, IdemAnnotation idemAnnotation) {//获得切入点方法的方法名String key = joinPoint.getSignature().getName();//获得方法的参数for (Object arg : joinPoint.getArgs()) {key += "_" + arg.hashCode();}//如果redis中有key就直接返回if (redisTemplate.hasKey(key)) {throw new BusinessException(BusinessErrorEnum.REPEAT_SUBMIT);}//生成redis的keyredisTemplate.opsForValue().set(key, "", idemAnnotation.timeout(), idemAnnotation.timeunit());}
}

注解类

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IdemAnnotation {long timeout() default 101;TimeUnit timeunit() default TimeUnit.SECONDS;
}

切面实现类

@IdemAnnotation
@PostMapping("/makeOrder")
public ResponseResult makeOrder(@RequestBody OrderRequest orderRequest,@RequestHeader String token) {Map<String, Object> payloads = jwtTokenTemplate.getPayloads(token);Long userId = Long.valueOf(payloads.get(GlobalSetting.USER_ID).toString());orderService.makeOrder(userId, orderRequest);return ResponseResult.success();
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词