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

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

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

說明:實(shí)際開發(fā)中,我們?cè)谇岸隧撁嫔宵c(diǎn)擊了一個(gè)按鈕,訪問了一個(gè)接口,這時(shí)因?yàn)榫W(wǎng)絡(luò)波動(dòng)或者其他原因,頁面上沒有反應(yīng),用戶可能會(huì)在短時(shí)間內(nèi)再次點(diǎn)擊一次或者用戶以為沒有點(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è)接口訪問,我們可以通過AOP+自定義注解+Redis的方式,在接口上加一個(gè)自定義注解,然后通過AOP的前置通知,在Redis中存入一個(gè)有效期的值,當(dāng)訪問接口時(shí)這個(gè)值還未過期,則拋出異常,以此來避免短時(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 {

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

    /**
     * 限制訪問時(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類(通知類)
 */
@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);

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

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

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

演示

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

(首次訪問,沒得問題,同時(shí)在Redis中存入值)

在這里插入圖片描述

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

在這里插入圖片描述

在這里插入圖片描述

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

在這里插入圖片描述

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

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

相關(guān)文章

  • Redis性能大幅提升之Batch批量讀寫詳解

    Redis性能大幅提升之Batch批量讀寫詳解

    這篇文章主要給大家介紹了關(guān)于Redis性能大幅提升之Batch批量讀寫的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • 詳解Redis中的BigKey如何發(fā)現(xiàn)和處理

    詳解Redis中的BigKey如何發(fā)現(xiàn)和處理

    這篇文章主要為大家詳細(xì)介紹了Redis中的BigKey如何發(fā)現(xiàn)和處理,文中給大家詳細(xì)講解了BigKey危害和如何解決這些問題,文章通過代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • Redis常見分布鎖的原理和實(shí)現(xiàn)

    Redis常見分布鎖的原理和實(shí)現(xiàn)

    這篇文章主要介紹了Redis常見分布鎖的原理和實(shí)現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Redis Desktop Manager(Redis可視化工具)安裝及使用圖文教程

    Redis Desktop Manager(Redis可視化工具)安裝及使用圖文教程

    這篇文章主要介紹了Redis Desktop Manager(Redis可視化工具)安裝及使用圖文教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • redis如何實(shí)現(xiàn)清空緩存

    redis如何實(shí)現(xiàn)清空緩存

    這篇文章主要介紹了redis如何實(shí)現(xiàn)清空緩存,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • redis?zrange?與?zrangebyscore的區(qū)別解析

    redis?zrange?與?zrangebyscore的區(qū)別解析

    這篇文章主要介紹了redis?zrange與zrangebyscore的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Redis 操作多個(gè)數(shù)據(jù)庫的配置的方法實(shí)現(xiàn)

    Redis 操作多個(gè)數(shù)據(jù)庫的配置的方法實(shí)現(xiàn)

    本文主要介紹了Redis 操作多個(gè)數(shù)據(jù)庫的配置的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Redis中big?keys發(fā)現(xiàn)與解決過程

    Redis中big?keys發(fā)現(xiàn)與解決過程

    文章從bigkeys的定義、產(chǎn)生原因、危害、如何發(fā)現(xiàn)以及處理方法等方面詳細(xì)介紹了Redis中bigkeys的問題,bigkeys會(huì)導(dǎo)致請(qǐng)求響應(yīng)慢、網(wǎng)絡(luò)卡頓、數(shù)據(jù)丟失等問題,需要通過異步刪除、拆分key等方法進(jìn)行處理
    2026-04-04
  • 一文淺析如何在Redis中實(shí)現(xiàn)緩存功能

    一文淺析如何在Redis中實(shí)現(xiàn)緩存功能

    Redis 是一種高性能的鍵值存儲(chǔ)系統(tǒng),廣泛用于實(shí)現(xiàn)緩存功能,這篇文章主要為大家詳細(xì)介紹了如何在Redis中實(shí)現(xiàn)緩存功能,需要的小伙伴可以了解下
    2025-06-06
  • Redis中一些最常見的面試問題總結(jié)

    Redis中一些最常見的面試問題總結(jié)

    Redis在互聯(lián)網(wǎng)技術(shù)存儲(chǔ)方面使用如此廣泛,幾乎所有的后端技術(shù)面試官都要在Redis的使用和原理方面對(duì)小伙伴們進(jìn)行各種刁難。下面這篇文章主要給大家總結(jié)介紹了關(guān)于Redis中一些最常見的面試問題,需要的朋友可以參考下
    2018-09-09

最新評(píng)論

霍邱县| 道真| 苏州市| 瑞金市| 灵宝市| 桦川县| 长武县| 郑州市| 阿荣旗| 花垣县| 西盟| 博湖县| 襄垣县| 弥勒县| 乌兰察布市| 内黄县| 衡水市| 大姚县| 乌兰县| 鹤山市| 罗甸县| 同德县| 道真| 通渭县| 洛浦县| 和顺县| 武乡县| 尤溪县| 宜兴市| 平塘县| 太保市| 蒙山县| 井陉县| 资阳市| 衡山县| 旺苍县| 西安市| 虞城县| 泰安市| 郴州市| 兰考县|