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

SpringBoot如何實現(xiàn)一個Redis限流注解

 更新時間:2025年04月21日 10:15:21   作者:無名指的等待712  
這篇文章主要介紹了利用SpringBoot實現(xiàn)一個Redis限流注解方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot實現(xiàn)一個Redis限流注解

使用步驟

1.引入庫

  • 代碼如下(示例)
        <!-- 引入SpringBoot Aop依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2.代碼實現(xiàn)

  • 添加注解
package com.hhh.springai_test.annotation;

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 RedisLimiting {

    int number() default 3;

    int time() default 60;

    String message() default "請求過于頻繁,請稍后再試";


}
  • 新增限流AOP實現(xiàn)
package com.hhh.springai_test.aop;

import cn.hutool.crypto.digest.MD5;
import com.hhh.springai_test.annotation.RedisLimiting;
import com.hhh.springai_test.common.ErrorCode;
import com.hhh.springai_test.exception.BusinessException;
import com.hhh.springai_test.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j;
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.stereotype.Component;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

@Aspect
@Component("redisLimitingAspect")
@Slf4j
public class RedisLimitingAspect {

    @Autowired
    private RedisUtils redisUtils;

    @Around("@annotation(com.hhh.springai_test.annotation.RedisLimiting)")  // 只攔截帶 @redisLimiting 的方法
    public Object redisLimiting(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod(); // 直接獲取被代理的方法
        // 獲取 @redisLimiting 注解
        RedisLimiting annotation = method.getAnnotation(RedisLimiting.class);
        if (annotation == null) {
            return joinPoint.proceed(); // 沒有注解,直接執(zhí)行方法
        }
        int limit = annotation.number(); // 限制次數(shù)
        int expire = annotation.time();  // 過期時間
        String message = annotation.message();

        log.info("攔截方法: {}, 限流 key: {}, 限流次數(shù): {}, 過期時間: {} 秒",
                method.getName(), limit, expire);

        // 執(zhí)行限流邏輯
        boolean isAllowed = checkRedisLimiting(method, joinPoint.getArgs(), limit, expire);
        if (!isAllowed) {
            throw new BusinessException(ErrorCode.BUSY_ERROR,message);
        }

        return joinPoint.proceed(); // 執(zhí)行原方法
    }

    private boolean checkRedisLimiting(Method method, Object[] args, int limit, int expire) {
        // 生成 Redis Key
        String redisKey = generateRedisKey(method, args);
        // 查詢 Redis 是否存在
        Object o = redisUtils.get(redisKey);
        if (o == null) {
            redisUtils.setex(redisKey, 1, expire); // 初始值設為1,并設置過期時間
            return true;
        } else {
            int count = Integer.parseInt(o.toString());
            if (count >= limit) {
                return false; // 超過限制
            } else {
                redisUtils.increment(redisKey, 1); // 遞增計數(shù)
                return true;
            }
        }
    }

    private String generateRedisKey(Method method, Object[] args) {
        StringBuilder builder = new StringBuilder();
        builder.append(method.getDeclaringClass().getName()).append(":").append(method.getName()).append(":");
        Parameter[] parameters = method.getParameters();
        for (int i = 0; i < parameters.length; i++) {
            builder.append(parameters[i].getName()).append("=").append(args[i]).append("&");
        }
        return MD5.create().digestHex16(builder.toString()); // 生成唯一 Redis Key
    }
}
  • 實現(xiàn)代碼的攔截
@GetMapping("/getAllModel")
    @RedisLimiting(number = 3, time = 60,message = "不要再請求我的獲取aiModel方法了")
    public BaseResponse<List<AiModelVO>> getAllModel() {
        return ResultUtils.success(aiModelService.getAllModel());
    }

總結

以上就是今天要講的內容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。

這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java的三種代理模式簡述

    Java的三種代理模式簡述

    這篇文章主要簡述Java的三種代理模式,java的代理模式主要包括靜態(tài)代理、動態(tài)代理、Cglib代理,感興趣的小伙伴可以參考下面文章的具體內容
    2021-09-09
  • Java計算程序代碼執(zhí)行時間的方法小結

    Java計算程序代碼執(zhí)行時間的方法小結

    這篇文章主要介紹了Java計算程序代碼執(zhí)行時間的方法,結合實例形式總結分析了java采用毫秒數(shù)及納秒數(shù)計算程序運行時間的相關操作技巧,需要的朋友可以參考下
    2017-11-11
  • 解決Springboot集成Redis集群配置公網(wǎng)IP連接報私網(wǎng)IP連接失敗問題

    解決Springboot集成Redis集群配置公網(wǎng)IP連接報私網(wǎng)IP連接失敗問題

    在Springboot 集成 Redis集群配置公網(wǎng)IP連接報私網(wǎng)IP連接失敗,一直報私有IP連接失敗,所以本文小編給大家介紹了如何解決報錯問題,如果有遇到相同問題的同學,可以參考閱讀本文
    2023-10-10
  • springboot自定義starter啟動器的具體使用實踐

    springboot自定義starter啟動器的具體使用實踐

    本文主要介紹了springboot自定義starter啟動器的具體使用實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SPRINGMVC 406問題解決方案

    SPRINGMVC 406問題解決方案

    這篇文章主要介紹了SPRINGMVC 406問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • SpringBoot攔截器實現(xiàn)項目防止接口重復提交

    SpringBoot攔截器實現(xiàn)項目防止接口重復提交

    基于SpringBoot框架來開發(fā)業(yè)務后臺項目時,接口重復提交是一個常見的問題,本文主要介紹了SpringBoot攔截器實現(xiàn)項目防止接口重復提交,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Java編程環(huán)境搭建和變量基本使用圖文教程

    Java編程環(huán)境搭建和變量基本使用圖文教程

    這篇文章主要介紹了Java編程環(huán)境搭建和變量基本使用,結合圖文形式詳細分析了java編程語言環(huán)境搭建、配置、變量、注釋的基本使用方法,需要的朋友可以參考下
    2020-02-02
  • Java設置Access-Control-Allow-Origin允許多域名訪問的實現(xiàn)方法

    Java設置Access-Control-Allow-Origin允許多域名訪問的實現(xiàn)方法

    這篇文章主要介紹了Java設置Access-Control-Allow-Origin允許多域名訪問的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • java中Class.forName的作用淺談

    java中Class.forName的作用淺談

    這篇文章介紹了java中Class.forName的作用,有需要的朋友可以參考一下
    2013-11-11
  • SpringBoot集成Spring Security的方法

    SpringBoot集成Spring Security的方法

    Spring security,是一個強大的和高度可定制的身份驗證和訪問控制框架。這篇文章主要介紹了SpringBoot集成Spring Security的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07

最新評論