欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis實(shí)現(xiàn)接口防抖的示例代碼

 更新時(shí)間:2024年10月14日 11:32:21   作者:何中應(yīng)  
本文介紹了一種通過(guò)AOP、自定義注解和Redis實(shí)現(xiàn)的接口防抖技術(shù),這種方法能有效避免因網(wǎng)絡(luò)波動(dòng)等原因短時(shí)間內(nèi)發(fā)送多個(gè)請(qǐng)求導(dǎo)致的數(shù)據(jù)重復(fù)添加問(wèn)題,感興趣的可以了解一下

說(shuō)明:實(shí)際開(kāi)發(fā)中,我們?cè)谇岸隧?yè)面上點(diǎn)擊了一個(gè)按鈕,訪問(wèn)了一個(gè)接口,這時(shí)因?yàn)榫W(wǎng)絡(luò)波動(dòng)或者其他原因,頁(yè)面上沒(méi)有反應(yīng),用戶(hù)可能會(huì)在短時(shí)間內(nèi)再次點(diǎn)擊一次或者用戶(hù)以為沒(méi)有點(diǎn)到,很快的又點(diǎn)了一次。導(dǎo)致短時(shí)間內(nèi)發(fā)送了兩個(gè)請(qǐng)求到后臺(tái),可能會(huì)導(dǎo)致數(shù)據(jù)重復(fù)添加。

為了避免短時(shí)間內(nèi)對(duì)一個(gè)接口訪問(wèn),我們可以通過(guò)AOP+自定義注解+Redis的方式,在接口上加一個(gè)自定義注解,然后通過(guò)AOP的前置通知,在Redis中存入一個(gè)有效期的值,當(dāng)訪問(wèn)接口時(shí)這個(gè)值還未過(guò)期,則拋出異常,以此來(lái)避免短時(shí)間內(nèi)對(duì)接口的方法。

實(shí)現(xiàn)

第一步:創(chuàng)建一個(gè)自定義注解,設(shè)置兩個(gè)屬性,一個(gè)是key,一個(gè)是這個(gè)key在Redis中的有效時(shí)間;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定義注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LimitAccess {

    /**
     * 限制訪問(wèn)的key
     * @return
     */
    String key();

    /**
     * 限制訪問(wèn)時(shí)間
     * @return
     */
    int times();
}

第二步:創(chuàng)建對(duì)應(yīng)的Aspect;

import com.hezy.annotation.LimitAccess;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

/**
 * AOP類(lèi)(通知類(lèi))
 */
@Component
@Aspect
public class LimitAspect {

    @Autowired
    private RedisTemplate redisTemplate;

    @Pointcut("@annotation(com.hezy.annotation.LimitAccess)")
    public void pt(){};

    @Around("pt()")
    public Object aopAround(ProceedingJoinPoint pjp) throws Throwable {
        // 獲取切入點(diǎn)上面的自定義注解
        Signature signature = pjp.getSignature();

        MethodSignature methodSignature = (MethodSignature) signature;

        // 獲取方法上面的注解
        LimitAccess limitAccess = methodSignature.getMethod().getAnnotation(LimitAccess.class);

        // 獲取注解上面的屬性
        int limit = limitAccess.times();
        String key = limitAccess.key();

        // 根據(jù)key去找Redis中的值
        Object o = redisTemplate.opsForValue().get(key);

        // 如果不存在,說(shuō)明是首次訪問(wèn),存入Redis,過(guò)期時(shí)間為limitAccess中的time
        if (o == null) {
            redisTemplate.opsForValue().set(key, "", limit, TimeUnit.SECONDS);
            // 執(zhí)行切入點(diǎn)的方法
            return pjp.proceed();
        } else {
            // 如果存在,說(shuō)明不是首次訪問(wèn),拋出異常
            throw new RuntimeException("訪問(wèn)過(guò)于頻繁");
        }
    }
}

第三步:在需要限制的接口上,加上這個(gè)注解,并設(shè)置key和限制訪問(wèn)時(shí)間,如下這個(gè)這個(gè)接口,設(shè)置key為limit,實(shí)際開(kāi)發(fā)中可以設(shè)置一個(gè)隨機(jī)值,或者按照規(guī)則自定義設(shè)置,times為限制訪問(wèn)時(shí)間;

    @GetMapping("/limit")
    @LimitAccess(key = "limit", times = 10)
    public String limit() {
        return "success";
    }

演示

啟動(dòng)項(xiàng)目,訪問(wèn)該接口;

(首次訪問(wèn),沒(méi)得問(wèn)題,同時(shí)在Redis中存入值)

在這里插入圖片描述

(短時(shí)間內(nèi),連續(xù)訪問(wèn),因?yàn)镽edis中值未過(guò)期)

在這里插入圖片描述

在這里插入圖片描述

(10秒之后再訪問(wèn),又可以了,Redis中的值過(guò)期了)

在這里插入圖片描述

以上就是使用Redis實(shí)現(xiàn)接口防抖,避免短時(shí)間內(nèi)連續(xù)訪問(wèn)接口。實(shí)際開(kāi)發(fā)中,可以將異常設(shè)置為自定義異常。

到此這篇關(guān)于Redis實(shí)現(xiàn)接口防抖的示例代碼的文章就介紹到這了,更多相關(guān)Redis 接口防抖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis實(shí)現(xiàn)每周熱評(píng)的項(xiàng)目實(shí)踐

    Redis實(shí)現(xiàn)每周熱評(píng)的項(xiàng)目實(shí)踐

    實(shí)時(shí)統(tǒng)計(jì)和展示熱門(mén)內(nèi)容是一種常見(jiàn)的需求,本文主要介紹了Redis實(shí)現(xiàn)每周熱評(píng)的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • Redisson分布式限流的實(shí)現(xiàn)原理解析

    Redisson分布式限流的實(shí)現(xiàn)原理解析

    這篇文章主要為大家介紹了Redisson分布式限流的實(shí)現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 淺析Redis中String數(shù)據(jù)類(lèi)型及其底層編碼

    淺析Redis中String數(shù)據(jù)類(lèi)型及其底層編碼

    這篇文章主要介紹?Redis?中?String?數(shù)據(jù)類(lèi)型及其底層編碼,文中有詳細(xì)的代碼示例,對(duì)大家的工作及學(xué)習(xí)有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • 基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列

    基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列

    這篇文章主要介紹了基于Redis實(shí)現(xiàn)分布式鎖以及任務(wù)隊(duì)列,需要的朋友可以參考下
    2015-11-11
  • IDEA初次連接Redis配置的實(shí)現(xiàn)

    IDEA初次連接Redis配置的實(shí)現(xiàn)

    本文主要介紹了IDEA初次連接Redis配置的實(shí)現(xiàn),文中通過(guò)圖文步驟介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • Redis結(jié)合Lua腳本實(shí)現(xiàn)分布式鎖詳解

    Redis結(jié)合Lua腳本實(shí)現(xiàn)分布式鎖詳解

    Lua?是一種輕量小巧的腳本語(yǔ)言,用標(biāo)準(zhǔn)C語(yǔ)言編寫(xiě)并以源代碼形式開(kāi)放,?本文主要為大家介紹了Redis如何結(jié)合Lua腳本實(shí)現(xiàn)分布式鎖,需要的可以參考下
    2024-02-02
  • 在Mac OS上安裝Vagrant和Docker的教程

    在Mac OS上安裝Vagrant和Docker的教程

    這篇文章主要介紹了在Mac OS上安裝Vagrant和Docker的教程,并安裝和設(shè)置Postgres和Elasticsearch和Redis,需要的朋友可以參考下
    2015-04-04
  • 詳解三分鐘快速搭建分布式高可用的Redis集群

    詳解三分鐘快速搭建分布式高可用的Redis集群

    這篇文章主要介紹了詳解三分鐘快速搭建分布式高可用的Redis集群,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Redis解決緩存擊穿問(wèn)題的兩種方法

    Redis解決緩存擊穿問(wèn)題的兩種方法

    緩存擊穿問(wèn)題也叫熱點(diǎn)Key問(wèn)題,就是?個(gè)被高并發(fā)訪問(wèn)并且緩存重建業(yè)務(wù)較復(fù)雜的key突然失效了,無(wú)數(shù)的請(qǐng)求訪問(wèn)會(huì)在瞬間給數(shù)據(jù)庫(kù)帶來(lái)巨大的沖擊,本文給大家介紹了Redis解決緩存擊穿問(wèn)題的兩種方法,需要的朋友可以參考下
    2025-03-03
  • Redis數(shù)據(jù)結(jié)構(gòu)之鏈表與字典的使用

    Redis數(shù)據(jù)結(jié)構(gòu)之鏈表與字典的使用

    這篇文章主要介紹了Redis數(shù)據(jù)結(jié)構(gòu)之鏈表與字典的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評(píng)論