亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot整合Redis并且用Redis實(shí)現(xiàn)限流的方法 附Redis解壓包

 更新時(shí)間:2024年06月28日 15:21:22   作者:熊哈哈O_o  
這篇文章主要介紹了SpringBoot整合Redis并且用Redis實(shí)現(xiàn)限流的方法 附Redis解壓包,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

本文介紹SpringBoot整合Redis并且進(jìn)行接口的限流,文章主要介紹的是一種思想,具體代碼還要結(jié)合實(shí)際。

一、Windows安裝Redis

Redis的解壓包我放在了百度網(wǎng)盤上,有需要的可以下載。

Redis-x64-3.0.504

百度網(wǎng)盤下載:

鏈接: https://pan.baidu.com/s/1hUSgEVjuTtfGyiBe4mmBXQ?pwd=tqrj 提取碼: tqrj

二、啟動(dòng)Redis

我們?cè)诒镜亟鈮合螺d的Redis壓縮包,打開解壓后的目錄,首先啟動(dòng)redis-server.exe,之后在啟動(dòng)redis-cli.exe。

啟動(dòng)成功截圖如下。

三、SpringBoot整合Redis 

1.引入依賴 

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

2.添加配置文件application.yml

 我們并沒有設(shè)置密碼所以不用配置。

spring: 
  redis:
    host: 127.0.0.1
    port: 6379

3.創(chuàng)建RedisController

我們現(xiàn)在是介紹思想,所以傳入了一個(gè)用戶的id來判斷是哪一個(gè)用戶訪問的接口。我們對(duì)redis中保存的key為用戶id的鍵值對(duì)進(jìn)行一個(gè)自增操作,然后返回這個(gè)自增后的值,這個(gè)值代表的就是我們?cè)谑腌妰?nèi)訪問接口的次數(shù)。每次訪問我們都重新設(shè)置這個(gè)鍵值對(duì)的有效時(shí)間,如果值大于5說明我們?cè)L問的次數(shù)已經(jīng)達(dá)到了系統(tǒng)對(duì)個(gè)人十秒鐘內(nèi)訪問次數(shù)的限制了,就不可以執(zhí)行我們的業(yè)務(wù)邏輯。

@Resource
private RedisTemplate<String, String> redisTemplate;
@GetMapping("/test2")
    public String test2(String id){
        Long increment = redisTemplate.opsForValue().increment(id);
        redisTemplate.expire(id,10,TimeUnit.SECONDS);
        if(increment > 5){
            return "不可以訪問,訪問次數(shù)為"+increment;
        }
        return "可以訪問,訪問次數(shù)為"+increment;
    }

之后啟動(dòng)我們的SpringBoot項(xiàng)目。我這里使用的是PostMan進(jìn)行的接口測(cè)試。

進(jìn)行第一次訪問。

第二次。

第五次 。

第六次。第六次可以看到接口的返回值為不可以訪問,說明我們的訪問次數(shù)已經(jīng)上限了,這時(shí)候就要等十秒后再次訪問了。

四、Redis限流的幾種方法 

1.基于Redis的數(shù)據(jù)結(jié)構(gòu)zset(滑動(dòng)窗口)

思想比較容易接收,我們定一個(gè)這樣一個(gè)key為limit的列表,每當(dāng)我們發(fā)送一次請(qǐng)求的時(shí)候,我們向這個(gè)列表當(dāng)中添加當(dāng)前的時(shí)間戳(前提是沒有被限流),當(dāng)然,在我們進(jìn)行數(shù)據(jù)的添加之前需要進(jìn)行是否需要進(jìn)行限流。我們?cè)O(shè)定intervalTime為限流的時(shí)間間隔,我們從limit列表中獲取我們?cè)L問接口的時(shí)間currentTIme-intervalTime,這樣我們判斷一下(currentTIme-intervalTime,currentTime)范圍內(nèi)的時(shí)間戳個(gè)數(shù),也就是我們請(qǐng)求的次數(shù),這樣就能判斷是否超過限制了。這里我用一張圖來表示。

既然叫做滑動(dòng)窗口,那這個(gè)窗口的大小就是我們進(jìn)行限流的時(shí)間間隔,這個(gè)窗口在我們的時(shí)間軸上進(jìn)行移動(dòng)。

代碼如下:

@GetMapping("/test3")
    public String test3(){
        int intervalTime = 10;
        Long currentTime = new Date().getTime();
        if(Boolean.TRUE.equals(redisTemplate.hasKey("limit"))) {
            Integer count = Objects.requireNonNull(redisTemplate.opsForZSet().rangeByScore("limit", currentTime - intervalTime, currentTime)).size();
            if (count != null && count > 5) {
                return "每分鐘最多只能訪問5次";
            }
        }
        redisTemplate.opsForZSet().add("limit", UUID.randomUUID().toString(),currentTime);
        return "訪問成功";
    }

 2.基于Redis的令牌桶算法

這個(gè)就好理解了,一個(gè)筐子里十個(gè)蘋果大家都去拿,拿到了就可以吃,拿不到就等著別人放。在Redis里我們?cè)谝粋€(gè)列表里放令牌,用戶訪問接口去嘗試拿這個(gè)令牌,拿到了就能訪問接口,拿不到就進(jìn)行限流,當(dāng)然除了拿令牌之外還放令牌,我們通過定時(shí)任務(wù)向列表內(nèi)放令牌。

 @GetMapping("/test3")
    public String test3(){
        Object result = redisTemplate.opsForList().leftPop("limit_list");
        if(result == null){
            return "當(dāng)前令牌桶中無令牌,無法訪問";
        }
        return "訪問成功";
    }
    @Scheduled(fixedDelay = 100,initialDelay = 0)
    public void setLimitListTask(){
        redisTemplate.opsForList().rightPush("limit_list",UUID.randomUUID().toString());
    }

定時(shí)任務(wù)到底如何使用,大家可以自行搜索一下。還有一些其他的方式本文就不在介紹了。

到此這篇關(guān)于SpringBoot整合Redis并且用Redis實(shí)現(xiàn)限流的方法 附Redis解壓包的文章就介紹到這了,更多相關(guān)SpringBoot Redis限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java 通過mave命令下載jar包的示例代碼

    Java 通過mave命令下載jar包的示例代碼

    這篇文章主要介紹了Java 通過mave命令下載jar的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • SpringMVC的Body參數(shù)攔截的問題

    SpringMVC的Body參數(shù)攔截的問題

    SpringMVC對(duì)出參和入?yún)⒂蟹浅S押玫耐卣怪С?方便你對(duì)數(shù)據(jù)的輸入和輸出有更大的執(zhí)行權(quán),我們?nèi)绾瓮ㄟ^SpringMVC定義的結(jié)果做一系列處理呢,需要的朋友可以參考下
    2018-06-06
  • java實(shí)現(xiàn)ReadWriteLock讀寫鎖的示例

    java實(shí)現(xiàn)ReadWriteLock讀寫鎖的示例

    ReadWriteLock是Java并發(fā)包中的接口,定義了讀鎖和寫鎖,讀鎖允許多線程同時(shí)訪問共享資源,而寫鎖則要求獨(dú)占,這種機(jī)制適用于讀多寫少的場(chǎng)景,可以提高并發(fā)效率同時(shí)保證數(shù)據(jù)一致性,本文就來詳細(xì)的介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2024-09-09
  • java中字符串常見的方法及總結(jié)

    java中字符串常見的方法及總結(jié)

    這篇文章主要介紹了java中字符串常見的方法及總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)通用模塊統(tǒng)一返回結(jié)果異常日志處理

    實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)通用模塊統(tǒng)一返回結(jié)果異常日志處理

    這篇文章主要為大家介紹了實(shí)戰(zhàn)分布式醫(yī)療掛號(hào)系統(tǒng)之統(tǒng)一返回結(jié)果統(tǒng)一異常處理,統(tǒng)一日志處理到通用模塊示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-04-04
  • java?環(huán)境配置(2023年詳細(xì)教程)

    java?環(huán)境配置(2023年詳細(xì)教程)

    這篇文章首先為了完善我的知識(shí)體系,今后一些軟件的安裝教程也可能會(huì)用到想寫一個(gè)更加詳細(xì)的,因?yàn)檫@并不僅僅是寫給?IT?行業(yè)的,其它行業(yè)可能也需要配置java環(huán)境
    2023-06-06
  • Springboot啟動(dòng)流程詳細(xì)分析

    Springboot啟動(dòng)流程詳細(xì)分析

    這篇文章主要介紹了SpringBoot啟動(dòng)過程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12
  • 詳解MyBatis多數(shù)據(jù)源配置(讀寫分離)

    詳解MyBatis多數(shù)據(jù)源配置(讀寫分離)

    這篇文章主要介紹了詳解MyBatis多數(shù)據(jù)源配置(讀寫分離),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • Java軟件設(shè)計(jì)模式之橋接模式詳解

    Java軟件設(shè)計(jì)模式之橋接模式詳解

    這篇文章主要介紹了Java軟件設(shè)計(jì)模式之橋接模式詳解,橋接模式也叫做橋梁模式,結(jié)構(gòu)型設(shè)計(jì)模式的一種,顧名思義,就是用來連接兩個(gè)部分,為被分離了的抽象部分和實(shí)現(xiàn)部分搭橋,需要的朋友可以參考下
    2023-07-07
  • java?HttpURLConnection類的disconnect方法與http長(zhǎng)連接詳解

    java?HttpURLConnection類的disconnect方法與http長(zhǎng)連接詳解

    這篇文章主要介紹了java?HttpURLConnection類的disconnect方法與http長(zhǎng)連接,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評(píng)論