redis防止重复提交的实现示例

 更新时间:2024年06月06日 11:28:46   作者:MurphyGuan  
在开发中我们都需要处理重复提交的问题,本文主要介绍了redis防止重复提交的实现示例,具有一定的参考价值,感兴趣的可以了解一下

说到防止重复提交,解决方案有很多。比如使用token、redis、表字段唯一约束、时间戳判断等。本篇文章介绍一下redis防止重复提交。

第一次遇到这个问题,是在我们的app点赞功能发现的。产品要求点赞只能点一次,但是发现快速多次点赞也是可以成功的。因为客户端在第一次请求接口后,还没有来得及把点赞图标置灰,就发起了第二次请求。

最后这个问题的解决方案是利用redis原子特性解决,在接口请求后设置一个短有效期的缓存,下次接口请求时继续设置这个缓存,如果缓存没有设置成功则代表重复提交。

下面说一下具体实现:

1.redis依赖

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

2.redis配置

package com.example.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * redis配置类
 * @author murphy
 * @date 2024/6/6
 */
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}

3.application.yml配置redis连接信息

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 0

4.redis缓存操作实现

在这里我们使用RedisTemplate的setIfAbsent方法设置了缓存并设置了一个10s的有效期,具体过期时间可以根据业务来定。setIfAbsent方法的意思是如果缓存之前不存在,设置成功后返回true。如果缓存之前存在了则不进行设置并且返回false。

package com.example.redis.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * redis操作实现
 * @author murphy
 * @date 2024/6/6
 */
@Service
public class RedisService {

    private static final int TTL = 10; // 过期时间,单位是秒

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public boolean preventDuplicateSubmission(String userId) {
        String key = "praise_:" + userId;
        Boolean success = redisTemplate.opsForValue().setIfAbsent(key, "1", TTL, TimeUnit.SECONDS);
        return Boolean.TRUE.equals(success);
    }
}

5.测试

我们可以根据preventDuplicateSubmission方法的返回结果来判断是否属于重复提交。下面模拟多次请求:

@Test
void contextLoads() {
  boolean res1 = redisService.preventDuplicateSubmission("1");
  System.out.println("第一次提交结果:" + res1);
  boolean res2 = redisService.preventDuplicateSubmission("1");
  System.out.println("第二次提交结果:" + res2);
  boolean res3 = redisService.preventDuplicateSubmission("1");
  System.out.println("第三次提交结果:" + res3);
}

返回结果:

到此这篇关于redis防止重复提交的实现示例的文章就介绍到这了,更多相关redis防止重复提交内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Spring Boot使用Hibernate-Validator校验参数时的长度校验方法详解

    Spring Boot使用Hibernate-Validator校验参数时的长度校验方法详解

    这篇文章主要给大家介绍了关于Spring Boot使用Hibernate-Validator校验参数时的长度校验方法的相关资料,在Spring Boot中可以使用Spring Boot Validation来对参数名称进行校验,需要的朋友可以参考下
    2023-08-08
  • 关于java入门与java开发环境配置详细教程

    关于java入门与java开发环境配置详细教程

    这篇文章主要介绍了关于java入门与java开发环境配置详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • java.lang.NumberFormatException异常解决方案详解

    java.lang.NumberFormatException异常解决方案详解

    这篇文章主要介绍了java.lang.NumberFormatException异常解决方案详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • java实现简单解析XML文件功能示例

    java实现简单解析XML文件功能示例

    这篇文章主要介绍了java实现简单解析XML文件功能,结合实例形式分析了java针对xml文件的读取、遍历节点及输出等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • 一文快速了解spring boot中的@idempotent注解

    一文快速了解spring boot中的@idempotent注解

    idempotence注解是RESTful API设计中一个重要的概念,它可以保证操作的可靠性和一致性,下面这篇文章主要给大家介绍了关于spring boot中@idempotent注解的相关资料,需要的朋友可以参考下
    2024-01-01
  • SpringBoot Starter自定义之创建可复用的自动配置模块方式

    SpringBoot Starter自定义之创建可复用的自动配置模块方式

    本文将详细介绍如何设计和实现一个自定义的Spring Boot Starter,帮助读者掌握这一强大技术,提升代码复用性和开发效率,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Kotlin常用函数let,with,run,apply用法与区别案例详解

    Kotlin常用函数let,with,run,apply用法与区别案例详解

    这篇文章主要介绍了Kotlin常用函数let,with,run,apply用法与区别案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • mapstruct的用法之qualifiedByName示例详解

    mapstruct的用法之qualifiedByName示例详解

    qualifiedByName的意思就是使用这个Mapper接口中的指定的默认方法去处理这个属性的转换,而不是简单的get set,今天通过本文给大家介绍下mapstruct的用法之qualifiedByName示例详解,感兴趣的朋友一起看看吧
    2022-04-04
  • 搭建简单的Spring-Data JPA项目

    搭建简单的Spring-Data JPA项目

    本文主要介绍了搭建简单的Spring-Data JPA项目,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Java中字符序列的替换与分解的几种实现方法

    Java中字符序列的替换与分解的几种实现方法

    本文主要介绍了Java中字符序列的替换与分解的几种实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02

最新评论