【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制

在高并发系统中,限流是一项非常重要的技术手段,用于保护后端服务,防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流,以及其原理、使用场景和完整代码示例。

目录

一、什么是限流

常见的限流算法

二、为什么选择 Redisson 实现分布式限流?

三、使用 Redisson 的 RRateLimiter 实现限流

主要功能

四、实现步骤

1.环境准备

1.1 引入依赖

1.2 配置 Redis

2.编写限流逻辑

2.1 配置 Redisson 客户端 在 Spring Boot 中自动注入 RedissonClient

2.2 实现限流功能 创建一个基于 RRateLimiter 的限流工具类

2.3 调用限流服务 在 Controller 中调用限流逻辑

五、测试限流效果

六、Redisson 限流实现的原理

七、常见应用场景

八、限流注意事项


一、什么是限流

限流(Rate Limiting)是对接口访问速率进行限制的技术手段,用于:

  • 保护服务:避免瞬间大流量压垮后端系统。
  • 公平分配资源:防止个别用户或服务消耗过多资源。
  • 防刷机制:防止恶意请求或攻击。

常见的限流算法

  1. 漏桶算法(Leaky Bucket):将请求按照固定速率流出,多余的请求会被丢弃。
  2. 令牌桶算法(Token Bucket):按照固定速率生成令牌,请求需消耗令牌才能被处理。

Redisson 的限流机制基于令牌桶算法。

二、为什么选择 Redisson 实现分布式限流?

  • 简单易用:Redisson 是一个强大的 Redis 客户端,封装了丰富的分布式工具。
  • 高性能:借助 Redis 实现分布式数据存储与计算,支持高并发场景。
  • 可扩展性强:支持多种限流场景,例如接口限流、用户限流、IP 限流等。

三、使用 Redisson 的 RRateLimiter 实现限流

RRateLimiter 是 Redisson 提供的分布式限流组件,支持令牌桶算法。

主要功能

  • 设置限流规则:包括令牌生成速率和时间窗口。
  • 请求令牌:通过消耗令牌来完成请求控制。
  • 分布式支持:多个服务实例共享同一个限流器。

四、实现步骤

以下是使用 Redisson 限流的完整步骤:

1.环境准备

1.1 引入依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.21.0</version>
</dependency>

1.2 配置 Redis

在 application.yml 文件中配置 Redis 连接:

spring:
  redis:
    host: 127.0.0.1
    port: 6379

2.编写限流逻辑

2.1 配置 Redisson 客户端 在 Spring Boot 中自动注入 RedissonClient

@Configuration
public class RedissonConfig {
    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        return Redisson.create(config);
    }
}

2.2 实现限流功能 创建一个基于 RRateLimiter 的限流工具类

@Service
public class RateLimiterService {
    @Autowired
    private RedissonClient redissonClient;

    public boolean tryAcquire(String key, long rate, long rateInterval, long timeout, TimeUnit unit) {
        // 获取限流器
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        
        // 配置限流规则
        rateLimiter.trySetRate(RateType.OVERALL, rate, rateInterval, RateIntervalUnit.SECONDS);

        // 尝试获取令牌
        return rateLimiter.tryAcquire(1, timeout, unit);
    }
}

2.3 调用限流服务 在 Controller 中调用限流逻辑

@RestController
@RequestMapping("/api")
public class ApiController {
    @Autowired
    private RateLimiterService rateLimiterService;

    @PostMapping("/access")
    public ResponseEntity<String> accessApi() {
        String key = "api:access";
        long rate = 100;  // 每秒生成 100 个令牌
        long rateInterval = 1;

        boolean allowed = rateLimiterService.tryAcquire(key, rate, rateInterval, 0, TimeUnit.SECONDS);
        if (!allowed) {
            return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body("请求过多,请稍后再试");
        }

        return ResponseEntity.ok("请求成功");
    }
}

五、测试限流效果

  • 启动服务后,使用工具(如 Postman 或 JMeter)模拟并发访问。
  • 根据 rate 参数设置,每秒最多允许 100 个请求通过,超出限制的请求会被拒绝并返回错误提示。

六、Redisson 限流实现的原理

  • 令牌桶算法

    1. 令牌生成:每隔 rateInterval 秒生成 rate 个令牌。
    2. 令牌消耗:每个请求消耗一个令牌,如果令牌不足则拒绝请求。
    3. 存储:令牌的生成和消耗通过 Redis 实现,因此支持分布式场景。
  • Redis 实现 Redisson 使用 Redis 的原子操作(如 EVAL)实现令牌的生成与消耗,从而保证数据一致性和高效性。

七、常见应用场景

  • 接口限流
    • 限制用户访问某个接口的频率,保护后端服务。
  • IP 限流
    • 对同一个 IP 地址的访问进行限制,防止恶意攻击。
  • 用户限流
    • 针对不同用户设置个性化的限流规则。

八、限流注意事项

  • 合理设置限流参数
    • 根据业务场景评估每秒允许的最大请求数和时间窗口大小。
  • 配合熔断机制
    • 当限流触发时,可以使用熔断机制返回备用响应。
  • 防止误锁
    • 在使用分布式限流时,确保限流器的 Key 是唯一的,避免不同接口共享同一个限流器。

点个关注,不会迷路! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/934561.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

聊聊在应用层面实现内网穿透功能是否可行

前言 最近接手了供方开发的网关项目&#xff0c;交接文档里面有个内网穿透的功能&#xff0c;一下子就吸引的我的目光。实现这个内网穿透的背景是业务部门有些业务是部署在公网&#xff0c;这些公网的业务想访问内网的业务&#xff0c;但因为公网和内网没打通&#xff0c;导致…

TPC-H数据集使用说明

TPCH数据使用说明 表模式&#xff1a; TPCH官网链接&#xff1a;TPC-H Homepage 同学们可以自行下载TPCH-tools自行生成数据&#xff08;10GB&#xff09;&#xff0c;下面主要是以mysql为例说明TPC-H的使用方法。 供同学自行参考&#xff1a; windows &#xff1a;TPC-H测…

vue2+html2canvas+js PDF实现试卷导出和打印功能

1.首先安装 import html2canvas from html2canvas; import { jsPDF } from jspdf; 2.引入打印插件print.js import Print from "/assets/js/print"; Vue.use(Print) // 打印类属性、方法定义 /* eslint-disable */ const Print function (dom, options) {if (…

Simdroid-EC:液冷仿真新星,助力新能源汽车电机控制器高效散热

近年来&#xff0c;新能源电动车的销量呈现出快速增长的态势。据统计&#xff0c;2024 年1-10月中国新能源汽车销量达728万辆&#xff0c;同比增长37.8%。 电机控制器在新能源汽车中对于保障动力和安全性能扮演着至关重要的角色&#xff0c;其核心部件IGBT&#xff08;绝缘栅双…

静态路由与交换机配置实验

1.建立网络拓扑 添加2台计算机&#xff0c;标签名为PC0、PC1&#xff1b;添加2台二层交换机2960&#xff0c;标签名为S0、S1&#xff1b;添加2台路由器2811&#xff0c;标签名为R0、R1&#xff1b;交换机划分的VLAN及端口根据如下拓扑图&#xff0c;使用直通线、DCE串口线连接…

深度学习:MindSpore自动并行

随着模型规模的逐渐增大&#xff0c;需要的算力逐渐增强&#xff0c;但是算力需求增长速度远高于芯片算力增长速度。现在唯一的解决方案只有通过超大规模集群训练大模型。 大集群训练大模型的挑战 内存墙 200B参数量的模型&#xff0c;参数内存占用745GB内存&#xff0c;训练…

前端成长之路:HTML(2)

HTML中有两个非常重要的标签——表格和表单&#xff0c;在介绍之前需要先了解表格和表单的区别&#xff1a;表格是用于展示数据的&#xff1b;表单是用于提交数据的。本文主要介绍表格。 表格标签 表格主要是用于显示、展示数据的&#xff0c;并非是页面布局。它可以使本来难…

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档

本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能&#xff0c;通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1&#xff0e;WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…

Facebook广告突然无消耗?原因解析与解决方案。

在Facebook广告投放中&#xff0c;广告突然无消耗是很多广告主都会遇到的难题。这种情况不仅浪费时间&#xff0c;还可能导致营销活动停滞&#xff0c;影响业务发展。那么&#xff0c;广告无消耗的原因是什么&#xff1f;又该如何解决呢&#xff1f; 一、Facebook广告无消耗的…

安卓调试环境搭建

前言 前段时间电脑重装了系统&#xff0c;最近准备调试一个apk&#xff0c;没想到装环境的过程并不顺利&#xff0c;很让人火大&#xff0c;于是记录一下。 反编译工具下载 下载apktool.bat和apktool.jar 官网地址&#xff1a;https://ibotpeaches.github.io/Apktool/install…

shell基础知识4----正则表达式

一、文本搜索工具——grep grep -参数 条件 文件名 其中参数有以下&#xff1a; -i 忽略大小写 -c 统计匹配的行数 -v 取反&#xff0c;不显示匹配的行 -w 匹配单词 -E 等价于 egrep &#xff0c;即启用扩展正则表达式 -n 显示行号 -rl 将指定目录内的文件打…

git branch -vv(显示本地分支与远程分支的最新状态和提交信息)(very verbose mode)

文章目录 字段说明下一步操作建议字段说明当前状态分析相关操作建议 -vv功能说明-vv 与单个 -v 的区别总结 出现如下状况&#xff0c;是因为我把本地的develop分支没有提交到gitlab上的develop分支。 而是把develop分支的内容提交到了gitlab上的master分支&#xff0c;这样是不…

树莓派4B android 系统添加led灯 Hal 层

本文内容需要用到我上一篇文章做的驱动&#xff0c;可以先看文章https://blog.csdn.net/ange_li/article/details/136759249 一、Hal 层的实现 1.Hal 层的实现一般放在 vendor 目录下&#xff0c;我们在 vendor 目录下创建如下的目录 aosp/vendor/arpi/hardware/interfaces/…

Apache DolphinScheduler 限制秒级别的定时调度

背景 Apache DolphinScheduler 定时任务配置采用的 7 位 Crontab 表达式&#xff0c;分别对应秒、分、时、月天、月、周天、年。 在团队日常开发工作中&#xff0c;工作流的定时调度一般不会细化到秒级别。但历史上出现过因配置的疏忽大意而产生故障时间&#xff0c;如应该配…

MTK Android12 开机向导

文章目录 需求-场景参考资料&#xff1a;博客资料官网参考资料&#xff1a;参考资料注意点 附件资料文件说明&#xff1a;推荐工具&#xff1a;配置定制的 声明叠加层 APK需求实现替换字符、删减开机向导界面、添加开机向导界面删除部分界面需求&#xff0c;官网说明如下更新部…

Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战

Text2SQL&#xff08;NL2sql&#xff09;对话数据库&#xff1a;设计、实现细节与挑战 前言1.何为Text2SQL&#xff08;NL2sql&#xff09;2.Text2SQL结构与挑战3.金融领域实际业务场景4.注意事项5.总结 前言 随着信息技术的迅猛发展&#xff0c;人机交互的方式也在不断演进。…

长沙数字孪生工业互联网三维可视化技术,赋能新型工业化智能制造工厂

长沙正积极拥抱数字化转型的浪潮&#xff0c;特别是在工业互联网和智能制造领域&#xff0c;长沙数字孪生技术的广泛应用&#xff0c;为新型工业化智能制造工厂的建设与发展注入了强劲动力。 在长沙智能制造工厂内&#xff0c;三维可视化技术被广泛应用于产线设计仿真优化和产…

FPGA工作原理、架构及底层资源

FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称&#xff08;IOB&#xff09;2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …

计算机网络期末常见问答题总结

1、试说明为什么在运输建立时使用三报文握手&#xff0c;如果不采用三报文握手会出现什么情况&#xff1f; TCP三次握手的目的是确保客户端和服务器都能够接收对方的连接请求,并建立起可靠的连接。如果只进行两次握手,可能会导致以下情况的发生: - 如果客户端发送的SYN包在网…

Redis篇-4--原理篇3--Redis发布/订阅(Pub/Sub)

1、概述 Redis 发布/订阅&#xff08;Publish/Subscribe&#xff0c;简称 Pub/Sub&#xff09;是一种消息传递模式&#xff0c;允许客户端订阅一个或多个通道&#xff08;channel&#xff09;&#xff0c;并接收其他客户端发布到这些通道的消息。 2、Redis 发布/订阅的主要概…