首页 > 数据库 >Springboot项目通过redis实现接口的幂等性

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

时间:2023-12-13 10:05:21浏览次数:34  
标签:Springboot Redis redis springframework 接口 import org requestId

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

  1. 添加依赖

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 配置Redis连接信息

application.propertiesapplication.yml中配置Redis连接信息:

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
spring.redis.database=0
  1. 编写幂等性工具类
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;
    }
}
  1. 实现幂等性的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,redis,springframework,接口,import,org,requestId
From: https://blog.51cto.com/u_15152703/8798194

相关文章

  • 基于SpringBoot实现文件的上传下载
    (一)概述文件上传下载一直都是一个系统最常用也是最基本的功能点,刚好最近公司的项目上有用到这个功能,于是自己就用SpringBoot也写了一个简化的版本,已实现文件的上传和下载功能。(二)创建项目首先创建一个SpringBoot的项目,接着引入相关的依赖,因为涉及到数据库的操作,所以依赖会比较多一些......
  • 使用SpringBoot实现文件上传和下载
    上传文件:1.在`pom.xml`文件中添加依赖:xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boo......
  • springboot实现文件的上传下载
    SpringBoot提供了简单易用的方式来处理文件上传和下载功能。下面是一个简单的示例:创建一个文件上传的控制器@RestControllerpublicclassFileUploadController{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(FileUploadController.class);@PostMappi......
  • 关于C#接口的用法详细解答,附上案例说明!
    接口C#中的接口是一种定义了一组方法、属性和事件的类型。它只包含成员的声明,而不包含任何实现。接口可以被类通过实现的方式使用,从而使类能够具有接口定义的行为。接口在C#中被定义为使用interface关键字,接口的成员默认是公共的。类通过使用implements关键字实现接口,并提供接口......
  • 接口类型
    接口1.接口继承(extends)如果两个接口之间有相同的属性和方法,可以将公共的属性和方法抽离出来,通过继承来复用interfacePoint1D{x:number;}interfacePoint2DextendsPoint1D{y:number;}interfacePoint3DextendsPoint2D,Point1D{z:number;}letpoint3d:......
  • 【Centos】Centos 7.6 安装 Redis 7.2.3
    1  前言我们继续安装Redis。2 安装步骤2.1 下载压缩包https://redis.io/download/2.2 解压tar-xvfredis-7.2.3.tar.gz2.3 安装make2.4 启动./src/redis-server./redis.conf2.5 修改配置修改配置文件:redis.conf#绑定开放bind127.0.0.......
  • 【SpringBootWeb入门-11】MySQL-概述-安装配置
    1、入门前言之前的文章我们讲解了javaweb的springboot框架的入门学习,javaweb开发-数据库也是我们需要学习的核心之一,接下来我们进入MySQL的学习,本篇内容主要讲解MySQL的安装以及配置。2、MySQL下载MySQL官方给我们提供了两种不同的版本:商业版本和社区版本,具体区别如下图:我们......
  • 【一个队列实现栈】Java队列——Queue接口-LinkedList实现类
    leetcode225.用队列实现栈题意:用一个队列实现栈题解:(1)弹栈:将队头开始的前size()-1个元素全部出队然后重新入队,使队尾元素循环到队头,然后弹出(2)获取栈顶元素:先将队头开始的前size()-1个元素全部出队然后重新入队,使队尾元素循环到队头,此时队头元素即为栈顶元素;然后再重新循环siz......
  • STP判断接口工作模式
    目录拓扑配置LSW1LSW2LSW3LSW4工作原理拓扑配置LSW1[Huawei]stpmodestp[Huawei]stppriority0\\将Lsw1的优先级调为0为根桥LSW2[Huawei]stpmodestp[Huawei]stppriority4096\\将Lsw1的优先级调为4096LSW3[Huawei]stpmodestpLSW4[Huawei]stpmodestp工......
  • SpringBoot MongoTemplate 实现分页
    一、MongoTemplate实现分页springboot集成Mongodb好像没有现成的分页工具,只能自己先查总数再查数据,需要进行两次查询。例如:@Testpublicvoidtest_119()throwsException{Queryquery=newQuery();longtotal=mongoTemplate.count(query,Dog.class);query.w......