最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

redis防止重復(fù)提交的實現(xiàn)示例

 更新時間:2024年06月06日 11:28:46   作者:MurphyGuan  
在開發(fā)中我們都需要處理重復(fù)提交的問題,本文主要介紹了redis防止重復(fù)提交的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下

說到防止重復(fù)提交,解決方案有很多。比如使用token、redis、表字段唯一約束、時間戳判斷等。本篇文章介紹一下redis防止重復(fù)提交。

第一次遇到這個問題,是在我們的app點贊功能發(fā)現(xiàn)的。產(chǎn)品要求點贊只能點一次,但是發(fā)現(xiàn)快速多次點贊也是可以成功的。因為客戶端在第一次請求接口后,還沒有來得及把點贊圖標(biāo)置灰,就發(fā)起了第二次請求。

最后這個問題的解決方案是利用redis原子特性解決,在接口請求后設(shè)置一個短有效期的緩存,下次接口請求時繼續(xù)設(shè)置這個緩存,如果緩存沒有設(shè)置成功則代表重復(fù)提交。

下面說一下具體實現(xiàn):

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緩存操作實現(xiàn)

在這里我們使用RedisTemplate的setIfAbsent方法設(shè)置了緩存并設(shè)置了一個10s的有效期,具體過期時間可以根據(jù)業(yè)務(wù)來定。setIfAbsent方法的意思是如果緩存之前不存在,設(shè)置成功后返回true。如果緩存之前存在了則不進(jìn)行設(shè)置并且返回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操作實現(xiàn)
 * @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.測試

我們可以根據(jù)preventDuplicateSubmission方法的返回結(jié)果來判斷是否屬于重復(fù)提交。下面模擬多次請求:

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

返回結(jié)果:

到此這篇關(guān)于redis防止重復(fù)提交的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)redis防止重復(fù)提交內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Mybatis之解決collection一對多問題(顯示的結(jié)果沒有整合到一起)

    Mybatis之解決collection一對多問題(顯示的結(jié)果沒有整合到一起)

    這篇文章主要介紹了Mybatis之解決collection一對多問題(顯示的結(jié)果沒有整合到一起),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    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

    該文章總結(jié)了使用Spring Boot和Tomcat過程中遇到的一個提示:"Loaded classes are up to date. Nothing to reload.",并提供了解決方案和經(jīng)驗分享,希望對讀者有幫助
    2026-05-05
  • 詳解MyBatis配置typeAliases的方法

    詳解MyBatis配置typeAliases的方法

    這篇文章主要介紹了詳解MyBatis配置typeAliases的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java編程實現(xiàn)排他鎖代碼詳解

    Java編程實現(xiàn)排他鎖代碼詳解

    這篇文章主要介紹了Java編程實現(xiàn)排他鎖的相關(guān)內(nèi)容,敘述了實現(xiàn)此代碼鎖所需要的功能,以及作者的解決方案,然后向大家分享了設(shè)計源碼,需要的朋友可以參考下。
    2017-10-10
  • 使用SpringBoot+AOP實現(xiàn)可插拔式日志的示例代碼

    使用SpringBoot+AOP實現(xiàn)可插拔式日志的示例代碼

    這篇文章主要介紹了使用SpringBoot+AOP實現(xiàn)可插拔式日志的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • java實現(xiàn)獲取網(wǎng)站的keywords,description

    java實現(xiàn)獲取網(wǎng)站的keywords,description

    這篇文章主要介紹了java實現(xiàn)獲取網(wǎng)站的keywords,description的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • @feignclient名字沖突的解決方案

    @feignclient名字沖突的解決方案

    這篇文章主要介紹了@feignclient名字沖突的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java利用位運(yùn)算實現(xiàn)乘法運(yùn)算詳解

    Java利用位運(yùn)算實現(xiàn)乘法運(yùn)算詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何用位運(yùn)算實現(xiàn)乘法運(yùn)算,在實現(xiàn)乘法時要用位運(yùn)算實現(xiàn),并且不能出現(xiàn)加減乘除任何符號,感興趣的可以了解一下
    2023-04-04

最新評論

皋兰县| 文化| 巢湖市| 芦山县| 曲沃县| 龙门县| 株洲县| 三台县| 同仁县| 呼图壁县| 九江市| 旺苍县| 诏安县| 英山县| 德昌县| 彭阳县| 江华| 阜平县| 民和| 兰坪| 崇礼县| 安泽县| 科技| 吴江市| 鸡泽县| 宁河县| 湛江市| 瑞金市| 西吉县| 保定市| 紫阳县| 亳州市| 安福县| 永新县| 新安县| 库伦旗| 陆河县| 珠海市| 河西区| 吉首市| 抚宁县|