Springboot项目通过redis实现接口的幂等性

 更新时间:2023年12月13日 11:12:14   作者:AD探草暴毙?  
这篇文章主要为大家介绍了Springboot项目通过redis实现接口的幂等性,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Spring Boot项目中通过Redis实现接口的幂等性

通常是通过在Redis中存储唯一标识符(token、UUID等)的方式来实现。当接口第一次被调用时,生成并存储一个唯一标识符到Redis,然后将该标识符返回给客户端。客户端在后续的请求中携带该标识符,服务端在处理请求之前检查Redis中是否存在该标识符,如果存在,则认为是重复请求,直接返回之前的结果,如果不存在,则继续处理请求并存储标识符。

添加依赖

确保在pom.xml中添加Redis依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置Redis连接信息

在application.properties或application.yml中配置Redis连接信息:

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0

编写幂等性工具类

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
@Component
public class IdempotenceUtil {
    private static final String IDEMPOTENCE_KEY_PREFIX = "idempotence:";
    @Autowired
    private StringRedisTemplate redisTemplate;
    public boolean isRequestProcessed(String requestId) {
        return redisTemplate.hasKey(idempotenceKey(requestId));
    }
    public void markRequestProcessed(String requestId, long timeoutSeconds) {
        redisTemplate.opsForValue().set(idempotenceKey(requestId), "processed", timeoutSeconds, TimeUnit.SECONDS);
    }
    private String idempotenceKey(String requestId) {
        return IDEMPOTENCE_KEY_PREFIX + requestId;
    }
}

实现幂等性的Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class IdempotentController {
    @Autowired
    private IdempotenceUtil idempotenceUtil;
    @PostMapping("/idempotent-operation")
    public ResponseEntity<String> idempotentOperation(@RequestHeader("request-id") String requestId) {
        // 检查是否已处理过该请求
        if (idempotenceUtil.isRequestProcessed(requestId)) {
            return ResponseEntity.ok("Operation already processed");
        }
        // 处理业务逻辑...
        // 标记请求已处理
        idempotenceUtil.markRequestProcessed(requestId, 60);
        return ResponseEntity.ok("Operation processed successfully");
    }
}

在上述示例中,IdempotenceUtil类封装了检查和标记请求是否已处理的逻辑。IdempotentController中的idempotentOperation方法通过@RequestHeader注解获取请求头中的唯一标识符(request-id),然后检查Redis中是否已处理过该请求,如果已处理,则返回结果,否则执行业务逻辑,标记请求已处理,并返回结果。

以上就是Springboot项目通过redis实现接口的幂等性的详细内容,更多关于Springboot redis接口幂等性的资料请关注脚本之家其它相关文章!

相关文章

  • 基于java TCP网络通信的实例详解

    基于java TCP网络通信的实例详解

    本篇文章是对java中TCP网络通信的实例进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • SpringCloud 微服务框架详解

    SpringCloud 微服务框架详解

    本文详细介绍了单体架构、垂直架构、分布式架构和微服务架构的特点和优缺点,重点讲解了微服务架构的四个原则,最后介绍了如何使用Nacos进行配置中心管理,并实现了配置的热更新,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • JAVA 运算符归纳总结

    JAVA 运算符归纳总结

    这篇文章主要对Java语法基础之运算符进行了详细的归纳总结,需要的朋友可以参考
    2017-04-04
  • SpringBoot整合BCrypt实现密码加密

    SpringBoot整合BCrypt实现密码加密

    这篇文章主要为大家详细介绍了SpringBoot整合BCrypt进行密码加密,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Spring循环依赖之问题复现详解

    Spring循环依赖之问题复现详解

    这篇文章主要为大家详细介绍了Spring的循环依赖什么时候会出现以及如何解决循环依赖,文中的示例代码讲解详细,感兴趣的可以学习一下
    2022-07-07
  • java 全角半角字符转换的方法实例

    java 全角半角字符转换的方法实例

    这篇文章主要介绍了java 全角半角字符转换的方法,大家参考使用吧
    2013-11-11
  • 一文读懂Jvm类加载机制

    一文读懂Jvm类加载机制

    这篇文章主要介绍了一文读懂Jvm类加载机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • jboss配置方法简明教程

    jboss配置方法简明教程

    这篇文章主要介绍了jboss配置方法,较为简明扼要的说明了jboss服务器所需要的JDK环境安装设置以及jboss的安装与下载,并分析了配置与使用中的常见问题,需要的朋友可以参考下
    2016-08-08
  • 使用java一维数组模拟压栈弹栈

    使用java一维数组模拟压栈弹栈

    这篇文章主要介绍了如何使用java一维数组模拟压栈弹栈,需要的朋友可以参考下
    2021-04-04
  • Java将List中对象的某一列转换为Set

    Java将List中对象的某一列转换为Set

    这篇文章主要为大家详细介绍了Java如何实现将List中对象的某一列转换为Set,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-12-12

最新评论