SpringBoot整合Redis并且用Redis實(shí)現(xiàn)限流的方法 附Redis解壓包
本文介紹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: 63793.創(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)行的接口測試。
進(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)文章希望大家以后多多支持腳本之家!
- springboot+redis 實(shí)現(xiàn)分布式限流令牌桶的示例代碼
- 使用SpringBoot?+?Redis?實(shí)現(xiàn)接口限流的方式
- SpringBoot中使用Redis對(duì)接口進(jìn)行限流的實(shí)現(xiàn)
- 基于SpringBoot+Redis實(shí)現(xiàn)一個(gè)簡單的限流器
- SpringBoot使用Redis對(duì)用戶IP進(jìn)行接口限流的示例詳解
- Springboot使用redis實(shí)現(xiàn)接口Api限流的實(shí)例
- SpringBoot使用Redis對(duì)用戶IP進(jìn)行接口限流的項(xiàng)目實(shí)踐
- Springboot+Redis實(shí)現(xiàn)API接口限流的示例代碼
- Springboot使用redis實(shí)現(xiàn)接口Api限流的示例代碼
- SpringBoot使用Redis進(jìn)行限流功能實(shí)現(xiàn)
相關(guān)文章
java使用鏈表實(shí)現(xiàn)約瑟夫環(huán)
這篇文章主要為大家詳細(xì)介紹了java使用鏈表實(shí)現(xiàn)約瑟夫環(huán),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Java Spring ApplicationEvent 代碼示例解析
本文解析了Spring事件機(jī)制,涵蓋核心概念(發(fā)布-訂閱/觀察者模式)、代碼實(shí)現(xiàn)(事件定義、發(fā)布、監(jiān)聽)及高級(jí)應(yīng)用(異步處理、事務(wù)綁定、執(zhí)行順序),對(duì)Java Spring ApplicationEvent概念相關(guān)知識(shí)感興趣的朋友一起看看吧2025-06-06
解決springboot+shiro 權(quán)限攔截失效的問題
這篇文章主要介紹了解決springboot+shiro 權(quán)限攔截失效的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java實(shí)現(xiàn)每日給女友微信發(fā)送早安信息
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)每日給女友微信發(fā)送早安等微信信息,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以了解一下2022-12-12
Java使用ScriptEngine動(dòng)態(tài)執(zhí)行代碼(附Java幾種動(dòng)態(tài)執(zhí)行代碼比較)
這篇文章主要介紹了Java使用ScriptEngine動(dòng)態(tài)執(zhí)行代碼,并且分享Java幾種動(dòng)態(tài)執(zhí)行代碼比較,需要的朋友可以參考下2021-04-04
淺談hibernate急迫加載問題(多重外鍵關(guān)聯(lián))
這篇文章主要介紹了淺談hibernate急迫加載問題(多重外鍵關(guān)聯(lián)),具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12
SpringBoot整合DeepSeek實(shí)現(xiàn)AI對(duì)話功能
本文介紹了如何在SpringBoot項(xiàng)目中整合DeepSeek API和本地私有化部署DeepSeekR1模型,通過SpringAI框架簡化了人工智能模型的集成,感興趣的小伙伴跟著小編一起來看看吧2025-02-02

