基于 Redisson 实现分布式系统下的接口限流

实验二 离散控制系统的性能分析(时域/频域) 1.掌握离散闭环系统的动态性能时域参数的分析与计算方法; 2.掌握离散系统稳定性的频域典型参数分析与计算方法。 MATLAB 软件( 2022a); 1.在 Matlab 语言平台上,通过给定的闭环离散系统,深刻理解时域参数的物理意义与计算方法,内容包括如下: 阻尼比参数分析:Z 平面与 S 平面的极点相互转换编程实现;分析 S/Z 两个平面域特殊特性(水平线、垂直线、斜线、圆周等)的极点轨迹相互映射方法;系统阶跃响应参数:上升时间和超调量等。 2. 采用频域分析方法,通过编程计算,进一步理解离散系统的稳定 阅读详情

在高并发场景下,接口限流是保障系统稳定性的重要手段。常见的限流算法有漏桶算法、令牌桶算法等,而单机模式的限流方案在分布式集群环境下往往失效。本文将介绍如何利用 Redisson 结合 Redis 实现分布式环境下的接口限流,确保集群中所有节点的流量控制保持一致。

分布式限流的核心挑战

在单机系统中,我们可以通过本地缓存(如 Guava 的 RateLimiter)实现限流,但在分布式集群环境下,这种方案会遇到两个核心问题:

  • 集群节点间的限流状态不共享,导致整体流量超过预期阈值
  • 无法保证同一用户 / IP 的请求在不同节点上被统一限制

因此,分布式限流需要一个「中心化的状态存储」来记录流量数据,而 Redis 凭借其高并发特性和分布式特性,成为了理想的选择。

基于 Redisson 的分布式限流设计思路

核心原理是通过 Redis 记录每个用户对接口的访问频率,利用分布式锁实现并发控制,具体设计如下:

  1. 唯一标识用户与接口
    为了避免限制 A 用户时影响 B 用户,需要为每个用户 + 接口组合生成唯一的「限流键」。

    一般为用户:使用 token + 接口路径 +用户的id

  2. 基于 Redis 的访问频率记录
    每次请求到来时,通过 Redisson 操作 Redis 记录访问时间,并检查单位时间内的访问次数是否超过阈值。

  3. AOP 无侵入式拦截
    通过自定义注解 + Spring AOP 拦截需要限流的接口,在请求到达时执行限流逻辑,不侵入业务代码。

  4. 自动过期的限流状态
    为 Redis 中的限流键设置过期时间,避免长期存储无效数据,同时确保超过限制时间后自动允许用户再次访问。

实现步骤

引入依赖

在 pom.xml 中添加 Redisson 和 AOP 依赖

<!-- Redisson 分布式工具 -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.23.3</version>
</dependency>

<!-- Spring AOP -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

定义限流注解

创建 @NoRepeatSubmit 注解,用于标记需要限流的接口,并支持自定义限流参数:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NoRepeatSubmit {

    /**
     * 设置请求锁定时间(秒)
     */
    int lockTime() default 5;
}

实现限流切面

通过 AOP 拦截 @NoRepeatSubmit 注解的方法,使用 Redisson 操作 Redis 实现限流逻辑:

Aspect
@Component
public class RepeatSubmitAspect {

    private static final Logger log = LoggerFactory.getLogger(RepeatSubmitAspect.class);

    @Resource
    private RedissonClient redissonClient;

    @Pointcut("@annotation(com.example.demo.config.NoRepeatSubmit)")
    public void pointCut() {
    }

    @Around("pointCut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod();
        NoRepeatSubmit annotation = method.getAnnotation(NoRepeatSubmit.class);

        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes == null) {
            throw new IllegalArgumentException("无法获取请求信息");
        }

        HttpServletRequest request = attributes.getRequest();
        String token = request.getHeader("token");
        String path = request.getServletPath();

        if (token == null || token.isEmpty()) {
            throw new IllegalArgumentException("缺少token请求头");
        }

        // 使用token+path作为锁的key
        String key = "repeat_submit:" + token + ":" + path;
        RLock lock = redissonClient.getLock(key);

        // 尝试获取锁,等待0秒,自动释放时间由注解指定
        boolean isSuccess = false;
            isSuccess = lock.tryLock(0, annotation.lockTime(), TimeUnit.SECONDS);
            if (isSuccess) {
                log.info("获取锁成功: {}", key);
                // 执行目标方法
                return pjp.proceed();
            } else {
                log.info("重复请求,获取锁失败: {}", key);
                return Result.fail("请勿重复提交请求");
            }
    }
}

测试

@RestController
@RequestMapping("/api/order")
public class OrderController {

    @PostMapping("/create")
    @NoRepeatSubmit(lockTime = 10) // 设置5秒内不允许重复提交
    public Result createOrder() {
        // 模拟订单创建过程
        try {
            Thread.sleep(2000); // 模拟业务处理耗时2秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return Result.success("订单创建成功");
    }
}

限制之后
在这里插入图片描述

这里还可以增加更多的逻辑,比如限制次数等等。

核心逻辑说明

  1. 用户唯一标识生成
    通过 getUniqueUserKey 方法获取用户标识:已登录用户用 token,未登录用户用 IP,确保不同用户的限流互不干扰。
  2. 限流键设计
    限流键格式为 rate_limit:用户标识:接口路径,例如 rate_limit:test_token:/api/order/submit,精确控制「用户 + 接口」的访问频率。
  3. 分布式锁的作用
    由于 Redis 的 INCR 操作虽然原子,但在高并发下可能出现「读取 - 判断 - 更新」的竞态条件,因此通过 Redisson 分布式锁确保计数逻辑的原子性。
  4. 自动过期机制
    每个限流键都设置了与时间窗口相同的过期时间,避免 Redis 中存储大量无效数据,同时确保时间窗口结束后自动重置计数。
    由于 Redis 的 INCR 操作虽然原子,但在高并发下可能出现「读取 - 判断 - 更新」的竞态条件,因此通过 Redisson 分布式锁确保计数逻辑的原子性。
  5. 自动过期机制
    每个限流键都设置了与时间窗口相同的过期时间,避免 Redis 中存储大量无效数据,同时确保时间窗口结束后自动重置计数。
Openclaw第5章 知识库管理 💡:学会使用 OpenClaw构建个人知识库系统,实现网页文章存档、GitHub项目管理、论文笔记整理和跨设备同步。 阅读详情

相关推荐

谷歌Gemini模型免费API调用全攻略:从注册到实战(附代码示例)

本文详细介绍了如何免费调用谷歌Gemini模型的API,从注册获取API密钥到实战应用的全过程。内容涵盖环境准备、基础API调用、多模态处理、高级功能及生产环境实践,帮助开发者高效利用Gemini模型进行代码生成和复杂任务处理。附有代码示例,适合AI开发者和技术爱好者。

weixin_29212429的博客 1601

gateway Redisson接口级别限流解决方案

在当今互联网时代,面对快速增长的用户流量和不断扩大的系统规模,合理的限流策略变得愈发重要。针对这一问题,Redisson作为一款高性能的分布式应用开发框架,在限流方面拥有出色的技术。本文将深入探讨Redisson的限流器技术,为读者详细介绍其原理和应用。在软件架构中,限流器(Rate Limiter)是一种用于控制资源利用、维持服务质量和防止系统过载的重要组件。

Mr_Wanter 2115

从零开始解析N-CMAPSS数据集:航空发动机健康管理的入门指南

本文详细解析了N-CMAPSS数据集在航空发动机健康管理中的应用,从数据集的构成、关键变量到实际数据分析方法,为初学者提供了全面的入门指南。通过Python代码示例,展示了如何加载、探索和建模这一复杂数据集,帮助读者掌握航空发动机性能预测的核心技术。

weixin_29063979的博客 320

基于Sentinel实现对不同ip进行限流熔断

基于Sentinel实现对不同ip进行限流熔断

xundefined的博客 3771

【异常】Claude Code 400错误(Extra inputs are not permitted)解决方案

摘要:Claude Code 2.0.37+版本因API请求包含未支持的custom.input_examples参数导致400错误,使核心功能失效。解决方案是降级至稳定版v2.0.32:先卸载当前版本(npm uninstall -g @anthropic-ai/claude-code),再安装指定版本(npm install -g @anthropic-ai/claude-code@2.0.32),最后验证请求是否恢复正常。该问题确认在v2.0.32版本不存在。(148字)

奶爸的编程之路,也就一周冷个三天 2039

TripoSR: Fast 3D Object Reconstruction from a Single Image 论文阅读

模型的主要参数,如变换器的层数、三平面的维度、NeRF模型的具体细节和主要训练配置,在表1中详细说明。TripoSR的算法流程结合了先进的数据处理、模型设计和训练技术,使其能够在不到0.5秒的时间内从单张图像中快速生成详细的3D网格。总体而言,TripoSR是一个强大的3D重建工具,它在速度和质量上都表现出色,但也需要考虑到其对计算资源的需求和在处理极端复杂场景时可能遇到的挑战。:通过精心策划的训练数据集和多样化的数据渲染技术,TripoSR提高了模型的泛化能力和对真实世界图像的适应性。

Christo的博客 1946

分布式接口限流与防重复提交实现方案

本文提出一种基于Redisson的分布式接口限流与防重复提交方案,通过自定义@RateLimit注解和AOP切面实现低侵入式流量控制。方案采用Redis存储全局限流状态,支持多实例协同,利用SHA256摘要确保不同参数请求独立计数。核心实现包括:定义限流注解配置时间窗口和键前缀,通过Redisson的RRateLimiter创建分布式限流器,在方法执行前进行原子性限流校验。该方案适用于核心接口防刷、防重复提交等场景,具有分布式支持、参数敏感、灵活配置等特点,能有效应对流量洪峰、恶意请求等问题。

Rysxt_的博客 1077

博途PLC PID仿真LSim_PT1库算法(一阶系统差分方程推导全过程)

博途PLC的PID仿真可以参看下面这篇博客,这篇文章我们主要论坛仿真库LSim的算法由来。如何利用博途PLC PID_Compact 进行PID仿真(一阶系统)_RXXW_Dor的博客-优快云博客博途PLC PID控制器 PID_Compact FB如何使用可以参看下面这篇文章,这里不再赘述。

RXXW_Dor的博客 2858

深入探讨接口限流:优化你的应用性能的关键步骤

限流是一种控制系统资源利用率的技术,它通过限制请求的数量或速率,以保护系统免受过载的影响。限流可以应用于各种系统中,包括网络服务、数据库、消息队列等。固定窗口算法(Fixed Window):在固定的时间窗口内计数请求,如果超过了限定的阈值,则拒绝后续请求。例如,限定每秒钟最多处理100个请求。滑动窗口算法(Sliding Window):与固定窗口算法类似,但窗口会根据时间动态滑动,以平滑请求速率的突发。这种算法可以更精确地控制请求速率。

竹密无妨溪水过,天高不碍白云飞 694

南方电网专业面试题(电气类-继电保护)(目录)

南方电网专业面试题(电气类-继电保护)(目录) 这些面试题围绕继电保护的基本概念、工作原理、分类、性能要求,以及变压器、断路器、母线保护、自动重合闸等电力系统关键设备的保护机制和操作原则展开,旨在评估应聘者对电力系统保护和控制策略的深入理解和实际应用能力。

weixin_44808274的博客 2159

Ghost卷积原理与构建YOLOv11的GhostNet变体

本文探讨了在边缘设备部署YOLOv11时使用Ghost卷积进行模型轻量化的实践经验。针对Jetson Nano的4GB内存限制,作者通过替换Backbone中的3x3标准卷积为Ghost卷积,实现了参数减少28%、推理速度提升38%,仅损失1.1%mAP的优化效果。文章详细介绍了Ghost卷积的实现原理、在YOLOv11中的具体替换策略,以及训练调参和部署优化的关键技巧。作者强调轻量化是计算效率与模型性能的权衡,建议工程团队保留原模型和Ghost变体两个版本,根据实际需求灵活切换。Ghost卷积的核心价值在

as1225120794的博客 169

分布式系统接口防抖:Redis实现与Spring Boot实践

接口防抖是分布式系统中控制请求频率的关键技术,通过时间窗口过滤重复请求来保障系统稳定性。其核心原理是利用Redis等中间件实现请求标记,与幂等性设计形成互补防护体系。在电商秒杀、支付确认等高并发场景中,合理的防抖策略能有效减轻数据库压力,防止重复下单等业务异常。本文以Redis分布式锁为例,结合Spring Boot框架,详解如何通过注解和AOP实现生产级防抖方案,包含Key生成策略、异常处理和性能优化等工程实践要点。

weixin_32822843的博客 222

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测

时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测 目录时间序列预测 | Python实现ARIMAX和VARMAX时间序列数据预测基本介绍ARIMAXVARVARMAVARMAXSESHWES参考资料 基本介绍 本文介绍ARIMAX、VAR、VARMA和VARMAX基本概念及其Python程序设计。 ARIMAX 具有外源回归量的自回归整合移动平均值(ARIMAX)是 ARIMA 模型的扩展,其还包括外生变量的建模。 外生变量也称为协变量,可以被认为是并行输入序列,其在与

前程算法屋的博客 6688

【Redisson】Redisson--限流器

主要原理就是调用接口之前,需要拥有指定个令牌。限流器每秒会产生X个令牌放入令牌桶,调用接口需要去令牌桶里面拿令牌。如果令牌被其它请求拿完了,那么自然而然,当前请求就调用不到指定的接口。基于Redis的分布式限流器RateLimiter可以用来在分布式环境下现在请求方的调用频率。既适用于不同Redisson实例下的多线程限流,也适用于相同Redisson实例下的多线程限流。但是有每10秒只允许发送1次的限制。用了一个死循环,但是从日志的打印效果上来看,每10秒才请求到一次我们的发送短信接口。

DreamSun的博客 5361

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

巧妙运用Redisson打造自定义限流注解,让接口防刷更高效

Redisson是一个Java驻内存数据网格(In-Memory Data Grid),它是建立在Redis基础之上的。这个库不仅仅是对Redis的一个简单封装,而是提供了一套丰富的分布式Java数据结构,例如分布式锁、原子长整型等高级功能。这些功能对于构建高并发且需要数据一致性的分布式系统至关重要。本文详细介绍了如何利用Redisson实现自定义限流注解,以保护API接口免受恶意刷取。

chen520的博客 2492

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Redisson分布式限流的使用及原理

Redisson分布式限流

weixin_66400215的博客 2292

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Redisson分布式限流

Redisson 是一个基于 Redis 的 Java 分布式框架,它不仅提供了对 Redis 各种数据结构的封装,还实现了许多分布式相关的服务,如分布式锁、限流器、信号量等,非常适合用于分布式系统中的流量控制、资源保护等场景。其核心特点包括:1.丰富的分布式对象:提供了分布式集合(如 Map、List、Set)、分布式锁(RLock)、限流器(RRateLimiter)、信号量(RSemaphore)等,简化分布式开发。2.高性能。

myGodxx的博客 1269

深入解析 Redisson 分布式限流器 RRateLimiter 的原理与实现

在分布式系统中,限流(Rate Limiting)是保障系统稳定性、避免过载的重要机制。Redisson 作为一个功能强大的 Redis 客户端,不仅提供了广泛使用的分布式锁,还包含了许多其他实用的分布式工具。其中,RRateLimiter 是 Redisson 提供的分布式限流器,功能强大。本文将详细解析 RRateLimiter 的原理,深入理解其工作机制。

博客 1547

SpringBoot接口限流的常用方案

http {# 定义限流共享内存区(名称=one,大小=10MB,速率=10请求/秒)# 其他全局配置...$binary_remote_addr:限流的键(基于客户端 IP 地址)。zone=one:10m:共享内存区名称为 one,大小为 10MB(根据客户端数量调整,10MB 约支持 16 万 IP)。rate=10r/s:基础速率(每秒允许 10 个请求)。

xiangzhihong8的专栏 1255

【 限流技术 | 从四大限流算法到Redisson令牌桶实践 】

本文介绍限流技术,解析固定窗口、滑动窗口、漏桶、令牌桶四种算法的原理、实现及优缺点,其中令牌桶因支持突发流量更推荐。还结合 Redisson 与 AOP 实现分布式令牌桶限流,通过注解配置多维度规则,解耦业务与限流逻辑。

2025优快云博客之星Top246,后端开发技术领域新星创作者。 1627

分布式服务限流实战,Redisson分布式限流器的使用及原理详解

高开必备基础内容,详细给你讲清楚底层逻辑。

java架构师进阶之路的博客 4094

四种限流算法详细介绍及Java代码实现

如果你不了解四种常见的限流算法的话,强烈建议看看这篇文章帮你快速了解和实现四种常见限流算法。

xyendjsj的博客 1607

高并发下的流量守卫:Redisson分布式限流方案全解析

你是否曾因突发流量导致系统崩溃?还在为如何在分布式系统中实现精准限流而烦恼?本文将带你深入了解Redisson如何基于Redis实现高效分布式限流,从核心原理到实战应用,让你轻松掌控流量脉搏。读完本文,你将掌握Redisson限流的配置方法、核心API使用及常见场景解决方案。 ## 为什么选择Redisson限流 在分布式系统中,限流是保护服务稳定性的关键手段。传统单机限流方案如令牌桶、漏桶算...

gitblog_00577的博客 785

Java 中间件:Redis 分布式限流器(Redisson RateLimiter)

Redis分布式限流器(Redisson RateLimiter)实现原理与应用 本文介绍了基于Redis的分布式限流解决方案Redisson RateLimiter,分析了其令牌桶算法实现原理。主要内容包括: 限流技术概念与分布式限流的必要性 Redisson客户端特点及RRateLimiter核心机制 底层Redis数据结构与Lua脚本原子操作实现 完整Java代码示例展示限流器创建与使用 实际应用场景与性能优化建议 通过流程图和代码演示,详细解析了分布式环境下如何保证限流的一致性和可靠性。适用于需要控

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

分布式限流终极方案:Redisson令牌桶算法实战指南

你是否还在为秒杀系统的流量峰值发愁?是否因突发请求导致服务雪崩而彻夜难眠?Redisson分布式限流组件基于Redis实现的令牌桶算法,可完美解决高并发场景下的流量控制难题。本文将深入剖析令牌桶算法的实现原理,对比漏桶算法的差异,并通过完整代码示例展示如何在生产环境中快速落地。 ## 限流算法核心原理 ### 令牌桶 vs 漏桶:算法对比 Redisson限流模块[RedissonRateL...

gitblog_00357的博客 1117

今天来讲讲分布式环境下,怎么达到对象共享,以及实现原子性(atomic),以Redis中的Redisson为例(实现分布式锁、分布式限流等)

相信各位对redis肯定是不陌生的,一个高吞吐量的内存型结构存储数据库。可用用于很多业务场景,能够有效的解决很多复杂的并发问题,分布式问题。 下面粘一下中文官网介绍: 关于解决对象共享问题,很多方式,通过一般的关系型数据库就可以(mysql),但是相较而言,mysql关系型数据库和nosql数据库,两者读写效率也是不一样的,一个在硬盘上工作,一个在内存上工作,此就是差距;频繁的IO操作,大大降低了CPU性能;redis采用cache。完全不一样的性能。 用一组数据对比: redis读写能力.

第二颗大白菜 2989
上一篇: 代码的隐形守护者:Spring AOP 是如何做到的?
下一篇: Springboot中的Shiro框架
梵高的代码色盘
博客等级 码龄5年 188粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值