国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot自定義注解+AOP+redis實現(xiàn)防接口冪等性重復(fù)提交,從概念到實戰(zhàn)

這篇具有很好參考價值的文章主要介紹了SpringBoot自定義注解+AOP+redis實現(xiàn)防接口冪等性重復(fù)提交,從概念到實戰(zhàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文為千鋒教育技術(shù)團獨家創(chuàng)作,更多技術(shù)類知識干貨,點個關(guān)注持續(xù)追更~

接口冪等性是Web開發(fā)中非常重要的一個概念,它可以保證多次調(diào)用同一個接口不會對結(jié)果產(chǎn)生影響。如果你想了解更多關(guān)于接口冪等性的知識,那么本文就是一個不錯的起點。

在Web開發(fā)中,我們經(jīng)常需要防止用戶重復(fù)提交某個操作,尤其是一些需要保證數(shù)據(jù)一致性的操作,如支付等。而接口冪等性就是解決這個問題的一種方案。

接口冪等性指的是:無論調(diào)用多少次同一個接口,最終的結(jié)果都是一致的。如果接口不具備冪等性,那么多次調(diào)用可能會導(dǎo)致數(shù)據(jù)的不一致性,甚至產(chǎn)生莫名其妙的錯誤。**

那么,如何實現(xiàn)接口冪等性呢?

本文小岳將給大家介紹一種實現(xiàn)方案,即:使用SpringBoot自定義注解+AOP+redis來實現(xiàn)防接口冪等性重復(fù)提交。

1.?概念解析

1.1?接口冪等性

接口冪等性是指:同一個接口的多次調(diào)用,最終的結(jié)果都是一致的。這意味著,無論調(diào)用多少次接口,最終的結(jié)果都應(yīng)該是相同的。這是因為接口的冪等性保證了多次調(diào)用接口不會對結(jié)果產(chǎn)生影響。

在Web開發(fā)中,保證接口冪等性非常重要。

例如, 假設(shè)我們有一個接口用來修改用戶信息,那么該接口應(yīng)該具備冪等性。如果用戶多次調(diào)用該接口,那么最終的結(jié)果都應(yīng)該是一致的,即用戶信息被修改成功。如果接口不具備冪等性,那么多次調(diào)用可能會導(dǎo)致數(shù)據(jù)的不一致性,甚至產(chǎn)生莫名其妙的錯誤。

為了實現(xiàn)接口的冪等性,我們可以使用一些技術(shù)手段,例如使用Token或者在服務(wù)端存儲請求的處理狀態(tài)。這些技術(shù)手段可以確保同一個請求只會被處理一次,從而保證接口的冪等性。

總之,接口冪等性是Web開發(fā)中非常重要的一個概念,它可以保證多次調(diào)用同一個接口不會對結(jié)果產(chǎn)生影響。因此,我們在開發(fā)過程中需要注意保證接口的冪等性,以確保系統(tǒng)的穩(wěn)定性和數(shù)據(jù)的一致性。

1.2?防重復(fù)提交

防重復(fù)提交是指系統(tǒng)要能夠識別出用戶重復(fù)提交某個操作,并且不會再次執(zhí)行該操作。這是為了避免數(shù)據(jù)的不一致性和重復(fù)操作產(chǎn)生的問題。

在本文中,我們使用自定義注解@Idempotent、AOP和Redis來實現(xiàn)防接口冪等性重復(fù)提交。

當(dāng)一個請求被處理過后,我們會將請求的處理狀態(tài)存儲到Redis中,并設(shè)置一個過期時間,以保證不會一直占用Redis的內(nèi)存空間。來看示例代碼:

@RestController
public class DemoController {

    @Autowired
    private RedisTemplate?redisTemplate;

    @GetMapping("/demo")
    @Idempotent(expire?= 60)
    public String demo(@RequestParam("id") Long?id) {
        if (redisTemplate.hasKey("demo:" +?id)) {
            return "請勿重復(fù)提交";
        }
        //?處理請求
????????redisTemplate.opsForValue().set("demo:" +?id, "1", 60, TimeUnit.SECONDS);
        return "success";
    }
}

在上面的代碼中,我們在demo方法上使用了自定義注解@Idempotent,并設(shè)置了過期時間為60秒。當(dāng)一個請求被處理過后,我們會將請求的處理狀態(tài)存儲到Redis中,以保證在60秒內(nèi)不會再次執(zhí)行該操作。如果用戶重復(fù)提交該操作,那么系統(tǒng)會返回請勿重復(fù)提交的提示。這樣就可以有效地避免接口重復(fù)提交產(chǎn)生的問題。

需要注意的是,為了防止多次請求同時到達服務(wù)器,導(dǎo)致多次同時處理,我們需要在Redis中加鎖,可以使用Redis的setnx命令或者分布式鎖來實現(xiàn)。另外,為了保證冪等性,我們需要保證請求是冪等的,即多次請求的結(jié)果都是一致的。如果請求不是冪等的,那么我們需要對請求進行去重處理,以保證只有一個請求被處理。

2.?實現(xiàn)方案

2.1?自定義注解

為了實現(xiàn)接口的冪等性,我們需要先定義一個自定義注解。注解的作用是標(biāo)記一個方法是否支持冪等性。如果支持冪等性,那么就需要對該方法進行特殊處理,使得多次調(diào)用該方法不會對結(jié)果產(chǎn)生影響。

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {
}

2.2?AOP切面

我們可以使用AOP來判斷一個方法是否被標(biāo)記了@Idempotent注解。如果被標(biāo)記了注解,那么就需要對該方法進行特殊處理,以實現(xiàn)冪等性。

@Aspect
@Component
public class IdempotentAspect {

    private final RedisTemplate?redisTemplate;

    @Autowired
    public IdempotentAspect(RedisTemplate?redisTemplate) {
        this.redisTemplate?=?redisTemplate;
    }

    @Around("@annotation(com.example.demo.annotation.Idempotent)")
    public Object idempotent(ProceedingJoinPoint?joinPoint) throws Throwable {
        //?獲取請求參數(shù)
        Object[]?args?=?joinPoint.getArgs();
        //?獲取請求方法
        MethodSignature?signature?= (MethodSignature)?joinPoint.getSignature();
        Method?method?=?signature.getMethod();
        //?獲取注解信息
        Idempotent?idempotent?=?method.getAnnotation(Idempotent.class);
        String?key?= getKey(joinPoint);
        //?判斷是否已經(jīng)請求過
        if (redisTemplate.hasKey(key)) {
            throw new RuntimeException("請勿重復(fù)提交");
        }
        //?標(biāo)記請求已經(jīng)處理過
????????redisTemplate.opsForValue().set(key, "1",?idempotent.expire(), TimeUnit.SECONDS);
        //?處理請求
        return?joinPoint.proceed(args);
    }

    /**
?????*?獲取redis?key
?????*/
    private String getKey(ProceedingJoinPoint?joinPoint) {
        MethodSignature?signature?= (MethodSignature)?joinPoint.getSignature();
        Method?method?=?signature.getMethod();
        String?methodName?=?method.getName();
        String?className?=?joinPoint.getTarget().getClass().getSimpleName();
        Object[]?args?=?joinPoint.getArgs();
        StringBuilder?sb?= new StringBuilder();
????????sb.append(className).append(":").append(methodName);
        for (Object?arg?:?args) {
????????????sb.append(":").append(arg.toString());
        }
        return?sb.toString();
    }
}

2.3?Redis存儲

我們使用Redis來存儲請求的處理狀態(tài)。當(dāng)一個請求被處理過后,我們會將請求的處理狀態(tài)存儲到Redis中,并設(shè)置一個過期時間,以保證不會一直占用Redis的內(nèi)存空間。

@Configuration
public?class?RedisConfig?{

????@Bean
????public?RedisTemplate?redisTemplate(RedisConnectionFactory?factory)?{
????????RedisTemplate?redisTemplate?=?new?RedisTemplate<>();
????????redisTemplate.setConnectionFactory(factory);
????????redisTemplate.setKeySerializer(new?StringRedisSerializer());
????????redisTemplate.setValueSerializer(new?StringRedisSerializer());
????????return?redisTemplate;
????}
}

2.4?示例代碼

下面是一個示例代碼,該代碼演示了如何使用@Idempotent注解來實現(xiàn)接口的冪等性。

@RestController
public class DemoController {

    @Autowired
    private RedisTemplate?redisTemplate;

    @GetMapping("/demo")
    @Idempotent(expire?= 60)
    public String demo(@RequestParam("id") Long?id) {
        //?處理請求
        return "success";
    }
}

3.?總結(jié)

本文介紹了如何使用SpringBoot自定義注解+AOP+redis來實現(xiàn)防接口冪等性重復(fù)提交。

我們首先定義了一個自定義注解@Idempotent,然后使用AOP來判斷一個方法是否被標(biāo)記了該注解。如果被標(biāo)記了該注解,那么就需要對該方法進行特殊處理,以實現(xiàn)冪等性。最后,我們使用Redis來存儲請求的處理狀態(tài),并設(shè)置一個過期時間,以保證不會一直占用Redis的內(nèi)存空間。


以上就是本文的全部內(nèi)容,更多技術(shù)類干貨,點我主頁持續(xù)追更~ 大家如果有技術(shù)類問題,歡迎和我們一起交流討論

祝天天開心!文章來源地址http://www.zghlxwxcb.cn/news/detail-439028.html

到了這里,關(guān)于SpringBoot自定義注解+AOP+redis實現(xiàn)防接口冪等性重復(fù)提交,從概念到實戰(zhàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • redis + AOP + 自定義注解實現(xiàn)接口限流

    限流(rate limiting) ? 是指在一定時間內(nèi),對某些資源的訪問次數(shù)進行限制,以避免資源被濫用或過度消耗。限流可以防止服務(wù)器崩潰、保證用戶體驗、提高系統(tǒng)可用性。 限流的方法有很多種,常見的有以下幾種: 漏桶算法: ?漏桶算法通過一個固定大小的漏桶來模擬流量

    2024年02月03日
    瀏覽(22)
  • springboot自定義注解+aop+redis實現(xiàn)延時雙刪

    springboot自定義注解+aop+redis實現(xiàn)延時雙刪

    redis作為用的非常多的緩存數(shù)據(jù)庫,在多線程場景下,可能會出現(xiàn)數(shù)據(jù)庫與redis數(shù)據(jù)不一致的現(xiàn)象 數(shù)據(jù)不一致的現(xiàn)象:https://blog.csdn.net/m0_73700925/article/details/133447466 這里采用aop+redis來解決這個方法: 刪除緩存 更新數(shù)據(jù)庫 延時一定時間,比如500ms 刪除緩存 這里之所以要延時一

    2024年01月17日
    瀏覽(20)
  • springboot3使用自定義注解+AOP+redis優(yōu)雅實現(xiàn)防重復(fù)提交

    springboot3使用自定義注解+AOP+redis優(yōu)雅實現(xiàn)防重復(fù)提交

    ? ??個人主頁:? ? ?蒾酒 ?? 系列專欄 :《spring boot實戰(zhàn)》 ?? 山高路遠,行路漫漫,終有歸途 目錄 寫在前面 實現(xiàn)思路 實現(xiàn)步驟 1.定義防重復(fù)提交注解 2.編寫一個切面去發(fā)現(xiàn)該注解然后執(zhí)行防重復(fù)提交邏輯 3.測試 依賴條件 1.接口上標(biāo)記防重復(fù)提交注解 2.接口測試 寫在最

    2024年04月11日
    瀏覽(21)
  • redis如何保證接口的冪等性

    redis如何保證接口的冪等性

    背景 如何防止接口中同樣的數(shù)據(jù)提交,以及如何保證消息不被重復(fù)消費,這些都是 shigen 在學(xué)習(xí)的過程中遇到的問題。今天,趁著在學(xué)習(xí) redis 的間隙,我寫了一篇文章進行簡單的實現(xiàn)。 注意:僅使用于單機的場景,對于分布式、高并發(fā)場景,還是建議使用分布式鎖。 首先我

    2024年02月09日
    瀏覽(27)
  • redis+token+分布式鎖確保接口的冪等性

    redis+token+分布式鎖確保接口的冪等性

    目錄 1.冪等性是什么? 2.如何實現(xiàn)冪等性呢? 1.新增管理員,出彈窗的同時,請求后臺。 2.后端根據(jù)雪花算法生成唯一標(biāo)識key,以雪花數(shù)為key存到redis。并返回key給前端。 3.前端保存后端傳過來的key。 4.前端輸入完成信息,點擊【保存】,攜帶key請求后端。 5.請求到達后端,

    2024年02月14日
    瀏覽(21)
  • SpringBoot定義攔截器+自定義注解+Redis實現(xiàn)接口防刷(限流)

    在攔截器Interceptor中攔截請求 通過地址+請求uri作為調(diào)用者訪問接口的區(qū)分在Redis中進行計數(shù)達到限流目的 定義參數(shù) 訪問周期 最大訪問次數(shù) 禁用時長 代碼實現(xiàn) 定義攔截器:實現(xiàn)HandlerInterceptor接口,重寫preHandle()方法 注冊攔截器:配置類實現(xiàn)WebMvcConfigurer接口,重寫addIntercep

    2024年02月05日
    瀏覽(32)
  • 騰訊二面:如何保證接口冪等性?高并發(fā)下的接口冪等性如何實現(xiàn)?

    什么是接口冪等性 接口冪等性這一概念源于數(shù)學(xué),原意是指一個操作如果連續(xù)執(zhí)行多次所產(chǎn)生的結(jié)果與僅執(zhí)行一次的效果相同,那么我們就稱這個操作是冪等的。在互聯(lián)網(wǎng)領(lǐng)域,特別是在Web服務(wù)、API設(shè)計和分布式系統(tǒng)中,接口冪等性具有非常重要的意義。 具體到HTTP接口或者

    2024年03月19日
    瀏覽(30)
  • 分布式接口冪等性設(shè)計實現(xiàn)

    分布式接口冪等性設(shè)計實現(xiàn)

    面對分布式架構(gòu)和微服務(wù)復(fù)雜的系統(tǒng)架構(gòu)和網(wǎng)絡(luò)超時服務(wù)器異常等帶來的系統(tǒng)穩(wěn)定性問題,分布式接口的冪等性設(shè)計顯得尤為重要。本文簡要介紹了幾種分布式接口冪等性設(shè)計實現(xiàn),包括Token去重機制、樂觀鎖機制、數(shù)據(jù)庫主鍵和狀態(tài)機實現(xiàn)等,以加深理解。 1、分布式接口冪

    2024年02月05日
    瀏覽(46)
  • Spring Boot 實現(xiàn)接口冪等性的 4 種方案

    Spring Boot 實現(xiàn)接口冪等性的 4 種方案

    現(xiàn)在的系統(tǒng)或平臺,為了追求體驗性、內(nèi)容豐富性,都是前后端分離,系統(tǒng)為了解藕會引入各種MQ等,都不可避免就引入了數(shù)據(jù)冪等性的問題。 冪等是一個數(shù)學(xué)與計算機學(xué)概念,在數(shù)學(xué)中某一運算為冪等時,其作用在任一元素兩次會和其作用一次的結(jié)果相同。 在計算機編程中

    2024年02月06日
    瀏覽(26)
  • rabbitmq+springboot實現(xiàn)冪等性操作

    文章目錄 1.場景描述 1.1 場景1 1.2 場景2 2.原理 3.實戰(zhàn)開發(fā) 3.1 建表 3.2 集成mybatis-plus 3.3 集成RabbitMq 3.3.1 安裝mq 3.3.2 springBoot集成mq 3.4 具體實現(xiàn) 3.4.1 mq配置類 3.4.2 生產(chǎn)者 3.4.3 消費者 消息中間件是分布式系統(tǒng)常用的組件,無論是異步化、解耦、削峰等都有廣泛的應(yīng)用價值。我們

    2024年02月10日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包