springboot高级教程基于 redis 通过注解实现限流

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: springboot高级教程基于 redis 通过注解实现限流

Spring Boot整合Redis有一种方便的方式是使用注解方式实现限流。


可以通过自定义注解的方式来标注需要限流的方法,在方法执行前进行限流的检查。


以下是具体实现方式:


1. 自定义注解`@RedisLimit`,并定义注解元素,如限流的时间、限流的次数等。

2. 编写切面类`RedisLimitAspect`,在方法执行前调用`RedisLimit`组件实现限流。

3. 将`RedisLimitAspect`类加入Spring容器中,以便进行注入。

4. 在需要进行限流的方法上添加`@RedisLimit`注解。


以下是示例代码:


`@RedisLimit`注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedisLimit {
    int limit() default 10;
    int timeout() default 60;
    String key() default "";
}


切面类`RedisLimitAspect`:


    @Aspect
    @Component
    public class RedisLimitAspect {
        @Autowired
        private RedisTemplate<String, String> redisTemplate;
        @Pointcut("@annotation(redisLimit)")
        public void pointcut(RedisLimit redisLimit) {}
        @Before("pointcut(redisLimit)")
        public void before(JoinPoint joinPoint, RedisLimit redisLimit) throws Throwable {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                    .getRequest();
            String ip = IpUtils.getRequestIp(request);
            String key = redisLimit.key().equals("") ? ip : redisLimit.key();
            int limit = redisLimit.limit();
            int timeout = redisLimit.timeout();
            if (!redisLimit(redisTemplate, key, limit, timeout)) {
                throw new RuntimeException("限流了");
            }
        }
        /**
         * 判断Redis中的key对应的值,是否满足小于limit
         *
         * @param redisTemplate RedisTemplate
         * @param key           键
         * @param limit         限流次数
         * @param timeout       超时时间(秒)
         * @return 是否限流
         */
        private boolean redisLimit(RedisTemplate<String, String> redisTemplate, String key, int limit, int timeout) {
            String value = String.valueOf(System.currentTimeMillis() / 1000);
            try {
                redisTemplate.watch(key);
                List<String> list = redisTemplate.opsForList().range(key, 0, -1);
                int count = 0;
                if (list != null && !list.isEmpty()) {
                    for (String time : list) {
                        if (Long.parseLong(time) >= (System.currentTimeMillis() / 1000 - timeout)) {
                            count++;
                        } else {
                            redisTemplate.opsForList().trim(key, count, -1);
                            break;
                        }
                    }
                }
                if ((count + 1) > limit) {
                    return false;
                }
                redisTemplate.multi();
                redisTemplate.opsForList().rightPush(key, value);
                redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
                redisTemplate.exec();
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                redisTemplate.unwatch();
            }
            return true;
        }
    }


    在需要进行限流的方法上添加`@RedisLimit`注解:


      @RestController
      public class TestController {
          @GetMapping("/test")
          @RedisLimit(key = "testKey", limit = 5, timeout = 60)
          public String test() {
              return "success";
          }
      }


      注意:在使用`@RedisLimit`注解时,每个方法对应的key不应该相同,否则会出现相互干扰的情况。

      目录
      相关文章
      |
      3月前
      |
      安全 NoSQL Java
      SpringBoot接口安全:限流、重放攻击、签名机制分析
      本文介绍如何在Spring Boot中实现API安全机制,涵盖签名验证、防重放攻击和限流三大核心。通过自定义注解与拦截器,结合Redis,构建轻量级、可扩展的安全防护方案,适用于B2B接口与系统集成。
      551 3
      |
      2月前
      |
      NoSQL Java 网络安全
      SpringBoot启动时连接Redis报错:ERR This instance has cluster support disabled - 如何解决?
      通过以上步骤一般可以解决由于配置不匹配造成的连接错误。在调试问题时,一定要确保服务端和客户端的Redis配置保持同步一致。这能够确保SpringBoot应用顺利连接到正确配置的Redis服务,无论是单机模式还是集群模式。
      234 5
      |
      3月前
      |
      缓存 Java 应用服务中间件
      Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
      本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
      570 5
      |
      3月前
      |
      NoSQL Java 调度
      分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
      分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
      223 0
      分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
      |
      6月前
      |
      算法 网络协议 Java
      Spring Boot 的接口限流算法
      本文介绍了高并发系统中流量控制的重要性及常见的限流算法。首先讲解了简单的计数器法,其通过设置时间窗口内的请求数限制来控制流量,但存在临界问题。接着介绍了滑动窗口算法,通过将时间窗口划分为多个格子,提高了统计精度并缓解了临界问题。随后详细描述了漏桶算法和令牌桶算法,前者以固定速率处理请求,后者允许一定程度的流量突发,更符合实际需求。最后对比了各算法的特点与适用场景,指出选择合适的算法需根据具体情况进行分析。
      515 56
      Spring Boot 的接口限流算法
      |
      6月前
      |
      机器学习/深度学习 数据采集 人机交互
      springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
      智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
      436 0
      |
      9月前
      |
      存储 人工智能 NoSQL
      SpringBoot整合Redis、ApacheSolr和SpringSession
      本文介绍了如何使用SpringBoot整合Redis、ApacheSolr和SpringSession。SpringBoot以其便捷的配置方式受到开发者青睐,通过引入对应的starter依赖,可轻松实现功能整合。对于Redis,可通过配置RedisSentinel实现高可用;SpringSession则提供集群Session管理,支持多种存储方式如Redis;整合ApacheSolr时,借助Zookeeper搭建SolrCloud提高可用性。文中详细说明了各组件的配置步骤与代码示例,方便开发者快速上手。
      173 11
      |
      NoSQL Redis
      注解的方式实现redis分布式锁
      创建redisLock注解: import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.
      1277 0
      |
      7月前
      |
      缓存 NoSQL 关系型数据库
      美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
      美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
      美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
      |
      2月前
      |
      缓存 负载均衡 监控
      135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
      在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。