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防止重复提交内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Mybatis之解决collection一对多问题(显示的结果没有整合到一起)

    Mybatis之解决collection一对多问题(显示的结果没有整合到一起)

    这篇文章主要介绍了Mybatis之解决collection一对多问题(显示的结果没有整合到一起),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java中Function的使用及说明

    Java中Function的使用及说明

    这篇文章主要介绍了Java中Function的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • struts2 中文乱码的解决办法分享

    struts2 中文乱码的解决办法分享

    这篇文章主要介绍了struts2 中文乱码的解决办法,需要的朋友可以参考下
    2014-02-02
  • idea一直提示Loaded classes are up to date.Nothing to reload的解决

    idea一直提示Loaded classes are up to da

    该文章总结了使用Spring Boot和Tomcat过程中遇到的一个提示:"Loaded classes are up to date. Nothing to reload.",并提供了解决方案和经验分享,希望对读者有帮助
    2026-05-05
  • 详解MyBatis配置typeAliases的方法

    详解MyBatis配置typeAliases的方法

    这篇文章主要介绍了详解MyBatis配置typeAliases的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java编程实现排他锁代码详解

    Java编程实现排他锁代码详解

    这篇文章主要介绍了Java编程实现排他锁的相关内容,叙述了实现此代码锁所需要的功能,以及作者的解决方案,然后向大家分享了设计源码,需要的朋友可以参考下。
    2017-10-10
  • 使用SpringBoot+AOP实现可插拔式日志的示例代码

    使用SpringBoot+AOP实现可插拔式日志的示例代码

    这篇文章主要介绍了使用SpringBoot+AOP实现可插拔式日志的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • java实现获取网站的keywords,description

    java实现获取网站的keywords,description

    这篇文章主要介绍了java实现获取网站的keywords,description的相关资料,需要的朋友可以参考下
    2015-03-03
  • @feignclient名字冲突的解决方案

    @feignclient名字冲突的解决方案

    这篇文章主要介绍了@feignclient名字冲突的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java利用位运算实现乘法运算详解

    Java利用位运算实现乘法运算详解

    这篇文章主要为大家详细介绍了Java如何用位运算实现乘法运算,在实现乘法时要用位运算实现,并且不能出现加减乘除任何符号,感兴趣的可以了解一下
    2023-04-04

最新评论