springboot基于redis实现防止重复提交

使用Redis来防止Spring Boot应用中的接口被重复提交的完整示例代码。这个示例中,我们将创建一个简单的控制器,用于处理表单提交请求,并确保同一个用户在一定时间内不能重复提交同一个表单。

首先,确保你的Spring Boot项目中已经添加了Redis依赖。在pom.xml中添加如下依赖:

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

接下来,配置Redis连接信息。在application.propertiesapplication.yml中添加Redis服务器的连接配置:

# application.properties
spring.redis.host=localhost
spring.redis.port=6379

现在,我们可以在控制器中使用Redis来防止接口被重复提交。以下是一个简单的示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/submit")
public class SubmissionController {

    @Autowired
    private StringRedisTemplate<String, String> stringRedisTemplate;

    private static final String PREFIX = "submitLock";

    @PostMapping("/form")
    public String submitForm(@RequestParam("userId") String userId,
                              @RequestParam("formId") String formId) {
        // 创建一个唯一的锁标识,例如用户ID和表单ID的组合
        String lockKey = PREFIX + ":" + userId + ":" + formId;

        // 尝试获取锁,如果锁不存在,则设置锁并执行业务逻辑
        if (stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "locked", 300, TimeUnit.SECONDS)) {
            try {
                // 执行表单提交的业务逻辑...
                // ...

                // 提交成功后,返回相应信息
                return "Form submitted successfully!";
            } finally {
                // 释放锁,以便其他请求可以继续执行
                stringRedisTemplate.delete(lockKey);
            }
        } else {
            // 如果锁已存在,表示表单已提交过或正在提交中
            return "Form submission is already in progress or has been submitted recently!";
        }
    }
}

在这个示例中,我们首先定义了一个锁的前缀PREFIX,然后创建了一个基于用户ID和表单ID的唯一锁键lockKey。我们使用setIfAbsent方法尝试在Redis中设置这个锁,如果设置成功,表示当前没有其他请求持有这个锁,我们可以安全地执行业务逻辑。
一旦业务逻辑执行完毕,我们使用finally块来确保锁被释放,这样其他等待的请求就可以继续执行了。

请注意,这个示例中的锁过期时间设置为300秒,这意味着用户在5分钟内不能重复提交同一个表单。你可以根据实际需求调整这个过期时间。

这个示例假设你已经有了一个配置好的Redis服务器,并且Spring Boot应用能够连接到这个服务器。同时,你需要确保StringRedisTemplate已经被注入到控制器中。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是使用 Spring Boot 基于 Redis 实现分布式锁的示例代码: 首先在 pom.xml 中添加 Redis 相关依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 然后创建一个 Redis 分布式锁的工具类: ```java @Component public class RedisLockUtil { @Autowired private RedisTemplate<String, String> redisTemplate; /** * 尝试获取分布式锁 * @param key 锁的名称 * @param value 锁的值 * @param expireTime 锁的过期时间,单位为秒 * @return 是否成功获取锁 */ public boolean tryLock(String key, String value, long expireTime) { Boolean result = redisTemplate.opsForValue().setIfAbsent(key, value, Duration.ofSeconds(expireTime)); return result != null ? result : false; } /** * 释放分布式锁 * @param key 锁的名称 * @param value 锁的值 */ public void unlock(String key, String value) { String currentValue = redisTemplate.opsForValue().get(key); if (StringUtils.isNotBlank(currentValue) && StringUtils.equals(currentValue, value)) { redisTemplate.delete(key); } } } ``` 在上述代码中,我们使用了 RedisTemplateRedis 进行操作,其中 tryLock() 方法尝试获取分布式锁,如果获取成功则返回 true,否则返回 false。unlock() 方法释放分布式锁。 最后,在需要使用分布式锁的地方注入 RedisLockUtil 并使用它进行加锁和解锁,示例如下: ```java @Service public class UserService { @Autowired private RedisLockUtil redisLockUtil; public void updateUser(User user) { String lockKey = "updateUser:" + user.getId(); String lockValue = UUID.randomUUID().toString(); try { boolean lockResult = redisLockUtil.tryLock(lockKey, lockValue, 60); if (lockResult) { // 获取分布式锁成功,执行更新操作 // ... } else { // 获取分布式锁失败,抛出异常或者重试 // ... } } finally { // 释放分布式锁 redisLockUtil.unlock(lockKey, lockValue); } } } ``` 在上述代码中,我们调用 RedisLockUtil 的 tryLock() 方法尝试获取分布式锁,如果获取成功则执行更新操作,否则抛出异常或者重试。最后在 finally 块中调用 RedisLockUtil 的 unlock() 方法释放分布式锁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值