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

SpringBoot使用Redis進(jìn)行限流功能實現(xiàn)

 更新時間:2025年10月23日 09:38:29   作者:小猿、  
Spring Boot中使用Redis實現(xiàn)限流功能是一種常見的做法,特別是在高并發(fā)場景下,限流可以有效防止系統(tǒng)過載,保證服務(wù)的穩(wěn)定性,本文就來詳細(xì)的介紹一下SpringBoot使用Redis進(jìn)行限流功能實現(xiàn),感興趣的可以了解一下

概述

Spring Boot中使用Redis實現(xiàn)限流功能是一種常見的做法,特別是在高并發(fā)場景下,限流可以有效防止系統(tǒng)過載,保證服務(wù)的穩(wěn)定性。

1. 限流的應(yīng)用場景

限流通常用于以下場景:

  • API限流:防止API被惡意或過度調(diào)用,保護(hù)后端服務(wù)。
  • 防止爬蟲:限制爬蟲的訪問頻率,防止數(shù)據(jù)被大量抓取。
  • 秒殺系統(tǒng):在秒殺活動中,限制用戶的請求頻率,防止系統(tǒng)崩潰。
  • 防止DDoS攻擊:通過限流防止分布式拒絕服務(wù)攻擊。

2. Redis限流的實現(xiàn)原理

Redis限流的常見實現(xiàn)方式有:

  • 計數(shù)器算法:通過Redis的INCR命令實現(xiàn)簡單的計數(shù)器限流。
  • 滑動窗口算法:通過Redis的有序集合(ZSET)實現(xiàn)滑動窗口限流。
  • 令牌桶算法:通過Redis的LISTZSET實現(xiàn)令牌桶限流。

下面我們以計數(shù)器算法為例,講解如何在Spring Boot中實現(xiàn)限流。

3. Spring Boot集成Redis實現(xiàn)限流

3.1 添加依賴

首先,在pom.xml中添加Spring Boot和Redis的依賴:

<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Redis Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <!-- Lettuce Redis Client -->
    <dependency>
        <groupId>io.lettuce</groupId>
        <artifactId>lettuce-core</artifactId>
    </dependency>
</dependencies>

3.2 配置Redis

application.properties中配置Redis連接信息:

spring.redis.host=localhost
spring.redis.port=6379

3.3 實現(xiàn)限流邏輯

我們可以通過自定義注解和AOP來實現(xiàn)限流功能。

3.3.1 自定義限流注解

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 RateLimiter {
    String key(); // Redis的key
    int limit();  // 限流次數(shù)
    int expire(); // 過期時間(秒)
}

3.3.2 實現(xiàn)AOP切面

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
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.lang.reflect.Method;

@Aspect
@Component
public class RateLimiterAspect {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Around("@annotation(rateLimiter)")
    public Object around(ProceedingJoinPoint joinPoint, RateLimiter rateLimiter) throws Throwable {
        String key = rateLimiter.key();
        int limit = rateLimiter.limit();
        int expire = rateLimiter.expire();

        // 獲取當(dāng)前請求的次數(shù)
        Long count = redisTemplate.opsForValue().increment(key, 1);

        if (count == 1) {
            // 如果是第一次請求,設(shè)置過期時間
            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
        }

        if (count > limit) {
            // 超過限流次數(shù),拋出異?;蚍祷劐e誤信息
            throw new RuntimeException("請求過于頻繁,請稍后再試");
        }

        // 執(zhí)行目標(biāo)方法
        return joinPoint.proceed();
    }
}

3.3.3 使用限流注解

在Controller中使用@RateLimiter注解:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class ApiController {

    @RateLimiter(key = "api:limit:test", limit = 5, expire = 60)
    @GetMapping("/test")
    public String test() {
        return "請求成功";
    }
}

4. 示例代碼解釋

  • @RateLimiter注解:用于標(biāo)記需要限流的方法,指定限流的key、限制次數(shù)和過期時間。
  • RateLimiterAspect切面:通過AOP攔截帶有@RateLimiter注解的方法,使用Redis的INCR命令實現(xiàn)計數(shù)器限流。
  • RedisTemplate:用于操作Redis,實現(xiàn)計數(shù)器的自增和過期時間設(shè)置。

5. 運行效果

  • 當(dāng)請求/api/test接口時,每60秒內(nèi)最多允許5次請求。
  • 如果超過5次請求,將拋出異常并返回錯誤信息。

6. 總結(jié)

通過Spring Boot和Redis的結(jié)合,我們可以輕松實現(xiàn)限流功能。計數(shù)器算法是最簡單的限流方式,適用于大多數(shù)場景。如果需要更復(fù)雜的限流策略(如滑動窗口、令牌桶等),可以基于Redis的有序集合或列表實現(xiàn)。

在實際應(yīng)用中,限流策略的選擇應(yīng)根據(jù)具體業(yè)務(wù)需求進(jìn)行調(diào)整,以確保系統(tǒng)的穩(wěn)定性和高可用性。

到此這篇關(guān)于SpringBoot使用Redis進(jìn)行限流功能實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot Redis 限流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA?tomcat啟動項目方式

    IDEA?tomcat啟動項目方式

    這篇文章主要介紹了IDEA?tomcat啟動項目方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • SpringBoot加載SQLite數(shù)據(jù)源方式

    SpringBoot加載SQLite數(shù)據(jù)源方式

    文章介紹了SpringBoot中配置SQLite數(shù)據(jù)源的流程,包括DBeaver連接數(shù)據(jù)庫、執(zhí)行建表與數(shù)據(jù)插入、引入依賴、初始化連接、定義實體類與Mapper,以及測試查詢操作,同時提及多數(shù)據(jù)源適配的擴(kuò)展方式
    2025-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之鏈表、棧、隊列、樹的實現(xiàn)方法示例

    Java數(shù)據(jù)結(jié)構(gòu)之鏈表、棧、隊列、樹的實現(xiàn)方法示例

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之鏈表、棧、隊列、樹的實現(xiàn)方法,結(jié)合實例形式分析了Java數(shù)據(jù)結(jié)構(gòu)中鏈表、棧、隊列、樹的功能、定義及使用方法,需要的朋友可以參考下
    2019-03-03
  • Java生成遞增流水號(編號+時間+流水號)簡單示例

    Java生成遞增流水號(編號+時間+流水號)簡單示例

    這篇文章主要給大家介紹了關(guān)于Java生成遞增流水號(編號+時間+流水號)的相關(guān)資料,在開發(fā)項目漫長的過程中常常會遇到流水號需要自動生成的問題存在,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • Spring Mybatis 基本使用過程(推薦)

    Spring Mybatis 基本使用過程(推薦)

    Mybatis是一個半自動ORM(Object Relational Mapping)框架,它可以簡化數(shù)據(jù)庫編程,讓開發(fā)者更專注于SQL本身,本文給大家介紹Spring Mybatis 基本使用過程,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Java中空指針異常該如何避免詳解

    Java中空指針異常該如何避免詳解

    空指針(Null Pointer Exception,NPE)是Java中最常見不過的異常了,其原因雖然顯而易見,但是開發(fā)人員往往會忽略,或未能及時采取措施,下面這篇文章主要給大家介紹了關(guān)于Java中空指針異常該如何避免的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 基于OpenID?Connect及Token?Relay實現(xiàn)Spring?Cloud?Gateway

    基于OpenID?Connect及Token?Relay實現(xiàn)Spring?Cloud?Gateway

    這篇文章主要介紹了基于OpenID?Connect及Token?Relay實現(xiàn)Spring?Cloud?Gateway,Spring?Cloud?Gateway旨在提供一種簡單而有效的方式來路由到API,并為API提供跨領(lǐng)域的關(guān)注點,如:安全性、監(jiān)控/指標(biāo)和彈性
    2022-06-06
  • 面試題:java中為什么foreach中不允許對元素進(jìn)行add和remove

    面試題:java中為什么foreach中不允許對元素進(jìn)行add和remove

    讀者遇到了一個比較經(jīng)典的面試題,也就是標(biāo)題上說的,為什么 foreach 中不允許對元素進(jìn)行 add 和 remove,本文就詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-10-10
  • 消息隊列-kafka消費異常問題

    消息隊列-kafka消費異常問題

    這篇文章主要給大家介紹了關(guān)于kafka的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Java中ShardingSphere 數(shù)據(jù)分片的實現(xiàn)

    Java中ShardingSphere 數(shù)據(jù)分片的實現(xiàn)

    其實很多人對分庫分表多少都有點恐懼,我們今天用ShardingSphere 給大家演示數(shù)據(jù)分片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評論