96SEO 2026-02-19 20:36 42
车熟路的修改它以满足我们自己的需求同时也可以学习人家解决问题的思路提升自己的技术水平

若依提供了很多实用且不花哨的注解本文记录了其中的一个注解RateLimiter--限流注解的实现步骤
以下源码内容是基于RuoYi-Vue-3.8.2版本即前后端分离版本
标注了RateLimiter注解的方法在执行前调用lua脚本把一段时间内的访问次数存入redis并返回判断返回值是否大于设定的阈值大于则抛出异常由全局异常处理器处理
我们先来看一看RateLimiter注解在src/main/java/com/ruoyi/common/annotation包下
Retention(RetentionPolicy.RUNTIME)
key存储在redis里用到的keytime限流时间相当于redis里的有效期count限流次数limitType:
限流类型点开枚举发现有默认和IP两种限流方式这两种方式的实现只是存储在redis里的key不同
我们来看一看RateLimiter这个注解的切面RateLimiterAspect.java在src/main/java/com/ruoyi/framework/aspectj包里
LoggerFactory.getLogger(RateLimiterAspect.class);private
setRedisTemplate1(RedisTemplateObject,
redisTemplate){this.redisTemplate
limitScript;}Before(annotation(rateLimiter))public
Collections.singletonList(combineKey);try{//
redisTemplate.execute(limitScript,
ServiceException(访问过于频繁请稍候再试);}log.info(限制请求{},当前请求{},缓存key{},
RuntimeException(服务器限流异常请稍候再试);}}public
StringBuffer(rateLimiter.key());//
判断限流类型如果是IP限流就在key后添加上IP若依自己写了一个获取ip的方法类大家可以自行查看if
LimitType.IP){stringBuffer.append(IpUtils.getIpAddr(ServletUtils.getRequest())).append(-);}//
key中添加方法名-类名stringBuffer.append(targetClass.getName()).append(-).append(method.getName());return
使用了set的方式注入了RedisTemplate和RedisScriptRedisTemplate大家都很熟悉RedisScript是用于加载和执行lua脚本的定义了一个前置通知废话限流肯定是前置通过getCombineKey方法获取应该存入redis中的keygetCombineKey方法每一步我都做了注解将key、time、count作为参数传入lua脚本执行脚本判断返回值为空或者或者返回值大于设定的count抛出异常由全局异常处理器处理方法不再往下执行达到了限流的效果
最后我们来看一看若依是怎么写lua脚本的在脚本在redis的配置类RedisConfig.java里该类在src/main/java/com/ruoyi/framework/config包下
泛型是返回值的类型DefaultRedisScriptLong
设置脚本redisScript.setScriptText(limitScriptText());//
设置返回值类型redisScript.setResultType(Long.class);return
接收3个变量key阈值count过期时间time调用get(key)方法获取key中的值current如果这个key存在并且current大于count返回current调用redis的自增函数赋值给current当current1时即第一次访问该接口调用redis的设置过期时间函数给当前key设置过期时间返回current
使用lua脚本可以在并发的情况下更好的满足原子性只是我不太明白若依为什么不把脚本文件单独拿出来写在resources文件夹下这样阅读和维护都会更加方便。
总之这就是若依限流注解的全部内容
标注了RateLimiter注解的方法在执行方法前调用lua脚本把自己的类名方法名当做key传入判断返回值是否大于设定的阈值大于则抛出异常不再向下执行异常由全局异常处理器处理。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback