【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)是对接口访问速率进行限制的技术手段,用于:
- 保护服务:避免瞬间大流量压垮后端系统。
- 公平分配资源:防止个别用户或服务消耗过多资源。
- 防刷机制:防止恶意请求或攻击。
常见的限流算法
- 漏桶算法(Leaky Bucket):将请求按照固定速率流出,多余的请求会被丢弃。
- 令牌桶算法(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.1port: 6379
2.编写限流逻辑
2.1 配置 Redisson 客户端 在 Spring Boot 中自动注入 RedissonClient
@Configuration
public class RedissonConfig {@Beanpublic 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 {@Autowiredprivate 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 {@Autowiredprivate 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 限流实现的原理
-
令牌桶算法
- 令牌生成:每隔
rateInterval秒生成rate个令牌。 - 令牌消耗:每个请求消耗一个令牌,如果令牌不足则拒绝请求。
- 存储:令牌的生成和消耗通过 Redis 实现,因此支持分布式场景。
- 令牌生成:每隔
-
Redis 实现 Redisson 使用 Redis 的原子操作(如
EVAL)实现令牌的生成与消耗,从而保证数据一致性和高效性。
七、常见应用场景
- 接口限流
- 限制用户访问某个接口的频率,保护后端服务。
- IP 限流
- 对同一个 IP 地址的访问进行限制,防止恶意攻击。
- 用户限流
- 针对不同用户设置个性化的限流规则。
八、限流注意事项
- 合理设置限流参数
- 根据业务场景评估每秒允许的最大请求数和时间窗口大小。
- 配合熔断机制
- 当限流触发时,可以使用熔断机制返回备用响应。
- 防止误锁
- 在使用分布式限流时,确保限流器的 Key 是唯一的,避免不同接口共享同一个限流器。

点个关注,不会迷路!
相关文章:
【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制
在高并发系统中,限流是一项非常重要的技术手段,用于保护后端服务,防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流,以及其原理、使用场景和完整代码示例。 目录 一、什么是限流…...
力扣-图论-8【算法学习day.58】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
Spring 中的验证、数据绑定和类型转换
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
Github----提交人不是自己
账号用户名都设置对的,但是提交人不是自己 解决 发现是用户名和账号都夹了"号导致 git config --global user.name "Your Name" git config --global user.email "your.emailexample.com"不用引号 git config --global user.name Your Name git …...
常用工具软件
前言 之前汇总过一篇嵌入式开发工具,但是掺杂了一些更偏向于日常使用的软件工具,这里单独提出来分享,都是自己在用的。 1.文件对比工具 BeyondCompare 文件对比利器,添加右键快捷键后。选中两个文件,右键可以直接进…...
Oracle报错ORA-01653: 表xx无法通过 8192在表空间中扩展
向Oracle 19g数据库中批量插入数据,当插入近2亿条数据后,报出如下错误: ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展 查看表空间,发现表空间大小已达到32G,表空间无法进行自动扩展了。(初始…...
【C语言】库函数常见的陷阱与缺陷(3):内存分配函数
目录 一、malloc 函数 1.1. 功能与常见用法 1.2. 陷阱与缺陷 1.3. 安全使用建议 1.4. 安全替代和代码示例 二、calloc 函数 2.1. 功能与常见用法 2.2. 陷阱与缺陷 2.3. 安全使用建议 2.4. 安全替代和代码示例 三、realloc 函数 3.1. 功能与常见用法 3.2. 陷阱与缺…...
Vue前端实现预览并打印PDF文档
一. 需求 1. 点击文档列表中的【打印】按钮,获取后台生成的PDF的url,弹窗进行预览: 2. 点击【打印】按钮,进行打印预览和打印: 二. 需求实现 首先后台给的是word文档,研究了一圈后发现暂时无法实现&…...
CSS学习记录07
CSS轮廓 轮廓是在元素周围绘制的一条线,在边框之外,以凸显元素。 CSS拥有如下轮廓属性: outline-styleoutline-coloroutline-widthoutline-offsetoutline 注意:轮廓与边框不同。不同之处在于:轮廓是在元素边框之外…...
喆塔科技携手国家级创新中心,共建高性能集成电路数智化未来
集创新之力成数智之塔 近日,喆塔科技与国家集成电路创新中心携手共建“高性能集成电路数智化联合工程中心”并举行签约揭牌仪式。出席此次活动的领导嘉宾包含:上海市经济和信息化委员会、上海市集成电路行业协会、复旦大学微电子学院、国家集成电路创新中…...
基于单片机的汽车雨刷器装置
摘要 下雨天时道路十分模糊,能见度非常低,司机分散注意力去手动打开雨刷器开关会非常危险。据统计,全世界雨天行车的车祸事故有7%是因为司机手动打开雨刷分心导致的。为了减小司机因为手动打开雨刷发生车祸的概率,所以…...
013-SpringBoot 定义优雅的全局异常处理方式
SpringBoot 定义优雅的全局异常处理方式 一、概述二、定义全局异常接口三、定义全局异常枚举四、定义全局基础异常五、定义全局基础业务异常六、定义全局返回七、定义全局返回工厂八、全局异常处理九、实体类十、Controller十一、效果展示一、概述 在日常项目开发中,异常是常…...
nginx 网页正常访问 F5 404
前端打包部署完,无论pc-web或h5-wap,访问正常,一刷新就会404。 解决方案: 在项目的nginx子配置文件中,加上以下代码 try_files $uri $uri/ /index.html;...
Idea Spring Initializr没有 Java 8选项解决办法
问题描述 在使用IDEA中的Spring Initializr创建新项目时,Java 版本近可选择Java17,21 。不能选择Java8;SpringBoot 版本也只有 3.x 问题原因 Spring 官方( https://start.spring.io/)不再提供旧版本的初始化配置 解决方案 方案 1 使用阿里…...
【Leetcode Top 100】104. 二叉树的最大深度
问题背景 给定一个二叉树 r o o t root root,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 数据约束 树中节点的数量在 [ 0 , 1 0 4 ] [0, 10 ^ 4] [0,104] 区间内。 − 100 ≤ N o d e . v a l ≤ 100 -100 \le Nod…...
C#实现一个HttpClient集成通义千问-开发前准备
集成一个在线大模型(如通义千问),来开发一个chat对话类型的ai应用,我需要先了解OpenAI的API文档,请求和返回的参数都是以相关接口文档的标准进行的 相关文档 OpenAI API文档 https://platform.openai.com/docs/api-…...
使用ssh免密登录实现自动化部署rsync+nfs+lsync(脚本)
单机一键部署sshrsyncnfslsync 执行准备 主机信息 主机角色外网IP内网IP主机名nfs、lsync10.0.0.31176.16.1.31nfs客户端10.0.0.7176.16.1.7web01rsync、nfs10.0.0.41172.16.1.41backup 秘钥信息 #web01可以免密连接nfs和backup [rootweb01 ~]# ssh-keygen [rootweb01 ~]#…...
若依集成更好用的easyexcel
背景 若依使用的是apach poi并在此基础上进行封装apach poi的原生的api是很复杂的,若依简化了了此操作apach poi的上传速率和下载速率都是没有优化的,依赖于文件大小的限制在此前提下,如果没法满足客户的需求(超大型文件的上传&am…...
去除背景 学习笔记
目录 rembg rembg 安装: pip install rembg import os from glob import glob from rembg import remove from argparse import ArgumentParser from PIL import Image if __name__ __main__:parser ArgumentParser()parser.add_argument(--path, typestr, re…...
我们来学mysql -- 隔离级别简介(原理篇)
隔离级别 别记题记隔离级别后记系列文章 别记 烧香拜佛要是有用,还需要我们来过吗…从个人情感角度,巴沙尔阿萨德 辜负了东大对他的期望他可是从正门踏进了灵隐寺 俄乌战争即将进入第三年(此时202412)此时的加沙正成为以色列建国…...
实战应用:在快马平台用jdk1.8的Stream API快速实现订单数据统计与分析
最近在做一个电商后台的数据分析需求时,发现用Java 8的Stream API处理集合数据特别高效。正好在InsCode(快马)平台上实践了一下,分享这个模拟订单统计的实战案例。 订单类设计 首先定义了一个订单类,包含订单ID、金额、客户类型和创建日期四个…...
告别信号焦虑:你的手机是如何通过载波聚合(CA)实现网速翻倍的?
告别信号焦虑:你的手机是如何通过载波聚合(CA)实现网速翻倍的? 站在地铁站台刷短视频突然卡成PPT,商场负一层扫码支付转圈半分钟——这些让人抓狂的场景背后,其实藏着运营商和手机厂商正在悄悄部署的"…...
SystemVerilog断言(SVA)避坑指南:从‘能用’到‘好用’,我踩过的那些Glue Logic和变量延时坑
SystemVerilog断言进阶实战:破解Glue Logic与动态延时的工程困局 当你的SVA断言从实验室demo走向真实芯片验证时,总会遇到这样的时刻:精心编写的断言在仿真中突然失效,或是让仿真速度下降了30%,又或是变成团队里没人敢…...
文件 IO
目录 一. 文件 1.1 文件的概念 1.2 文件目录 1.3 文件路径 1.3.1 绝对路径 1.3.2 相对路径 1.4 文件的类型 二. IO 2.1 文件系统操作-- File类 2.1.1 File类的构造方法 2.1.2 File类中的方法 2.2 文件内容操作 2.2.1 字节流 2.2.1.1 InputStream中的方法 2.2.1.2…...
解决GitHub打不开问题,顺利获取Lingbot模型开源代码与资源
解决GitHub打不开问题,顺利获取Lingbot模型开源代码与资源 你是不是也遇到过这种情况?项目开发到一半,需要去GitHub上拉取一个关键的模型代码,比如最近很火的Lingbot-Depth-Pretrain-ViTL-14,结果页面一直转圈圈&…...
Qwen3.5-2B轻量化部署:4GB显存GPU跑通多模态推理的完整环境配置
Qwen3.5-2B轻量化部署:4GB显存GPU跑通多模态推理的完整环境配置 1. 模型概述 Qwen3.5-2B是Qwen3.5系列中的轻量化多模态基础模型,仅有20亿参数规模,专为低功耗、低门槛部署场景设计。该模型具有以下核心特点: 资源占用低&#…...
如何将你的小爱音箱改造成智能AI语音助手:MiGPT终极教程
如何将你的小爱音箱改造成智能AI语音助手:MiGPT终极教程 【免费下载链接】mi-gpt 🏠 将小爱音箱接入 ChatGPT 和豆包,改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 想让家里的智能音箱从"…...
SCH1633-D01 | 汽车6DoF传感器 |无人机惯性装置
SCH1633-D01 村田Murata 6DoF陀螺仪加速度传感器一体型 汽车用SCH1600传感器系列通过冗余设计选项和内置可调双输出通道为资深客户提供更大的灵活性。300/s的角速率测量范围8g的加速度测量范围冗余数字加速度计通道,动态范围高至26g陀螺仪零偏不稳定性低至0.5/h&am…...
OpenPAI存储管理完全手册:支持NFS、SMB等多种存储方案
OpenPAI存储管理完全手册:支持NFS、SMB等多种存储方案 【免费下载链接】pai Resource scheduling and cluster management for AI 项目地址: https://gitcode.com/gh_mirrors/pa/pai OpenPAI作为开源AI平台,提供了完整的存储管理解决方案…...
Ostrakon-VL-8B终端部署详解:CSS像素级修复+终端打印效果实现原理
Ostrakon-VL-8B终端部署详解:CSS像素级修复终端打印效果实现原理 1. 项目概述与核心价值 Ostrakon-VL-8B是一款专为零售与餐饮场景优化的多模态大模型,我们将其能力封装成了一个具有独特像素艺术风格的Web交互终端。这个终端将复杂的图像识别任务转化为…...
