# union-common **Repository Path**: empty_null/union-common ## Basic Information - **Project Name**: union-common - **Description**: 访问频次限制工具类,通过Redis来实现。使用RedisTemplate配合Lua脚本,完成限制操作。只需要在目标方法增加注解,即可实现功能。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-08-24 - **Last Updated**: 2023-09-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: common, Redis, 限流, RedissonClient ## README # union-common #### 介绍 1. 访问频次限制工具类,通过Redis来实现。使用RedisTemplate配合Lua脚本,完成限制操作。只需要在目标方法增加注解,即可实现功能。 2. 集成Redisson,通过注解方式完成Redlock的加锁 3. 统计接口整个链路的耗时信息 #### 技术栈 + jdk 17 + springboot 3.1.2 + Redis + Redisson #### 安装教程 1. 引入仓库 2. 添加pom依赖 ```pom com.gitee.empty_null dependencies 0.0.2 pom import com.gitee.empty_null union-common-cache ``` 3. 通过添加注解方式使用功能 (1) 接口访问限制 ```java + @AccessLimiter public @interface AccessLimiter { String keyPrefix(); /** * 用户请求限制 */ boolean limit() default false; /** * 用户请求时间 * 毫秒 */ int expire() default 500; /** * 用户请求时间内次数 */ int permits() default 1; /** * 提示信息 */ String msg() default "当前请求太频繁,稍后再试"; /** * 请求入参中取key值 * SpEL 表达式支持 #key */ @Language(value = "SpEL") String keySpEL() default ""; /** * 是否抛异常 */ boolean throwException() default true; /** * throwException为false,不抛出异常时,自定义返回对象的SpEL表达式 * 支持 @bean.methodName(#param1) * 例: @testService.testMethod(#testKey) */ @Language(value = "SpEL") String resultExpression() default ""; } ``` (2)RedissonLock使用 ```java @EnableRedissonLock 开启RedissonLock注解 个性化配置@RedissonLock参数,完成加锁 public @interface RedissonLock { /** * key前缀 */ String keyPrefix(); /** * key值表达式 */ @Language("SpEL") String keySpEL() default ""; /** * tryLock锁最大时间 */ int timeout() default 0; /** * 时间单位 */ TimeUnit timeUnit() default TimeUnit.SECONDS; /** * 是否tryLockAsync */ boolean async() default false; } ``` (3)接口请求链路耗时统计 ```java @EnableStatisticsTime 开始统计功能 个性化配置@StatisticsTime信息,统计信息 public @interface StatisticsTime { /** * 前缀 */ String prefix() default "statistics:time"; boolean isEnd() default true; } ``` #### 使用说明 1. 接口访问限制,自定义实现方法 ```tex 继承DefaultLimitMethodStrategy或AbstractLimitMethodStrategy类, (1)通过覆写generateKey方法可自定义实现key的生成策略,通过覆写notAllow方法,自定义限制的规则 (2)通过AccessLimiter注解中throwException属性配合onErrorResult方法,在限制访问时,不抛出异常的方式,自定义返回对象信息 ```