当前位置: 首页 > news >正文

【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.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 限流实现的原理

  • 令牌桶算法

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

七、常见应用场景

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

八、限流注意事项

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

点个关注,不会迷路! 

相关文章:

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

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

力扣-图论-8【算法学习day.58】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…...

Spring 中的验证、数据绑定和类型转换

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

Github----提交人不是自己

账号用户名都设置对的,但是提交人不是自己 解决 发现是用户名和账号都夹了"号导致 git config --global user.name "Your Name" git config --global user.email "your.emailexample.com"不用引号 git config --global user.name Your Name git …...

常用工具软件

前言 之前汇总过一篇嵌入式开发工具&#xff0c;但是掺杂了一些更偏向于日常使用的软件工具&#xff0c;这里单独提出来分享&#xff0c;都是自己在用的。 1.文件对比工具 BeyondCompare 文件对比利器&#xff0c;添加右键快捷键后。选中两个文件&#xff0c;右键可以直接进…...

Oracle报错ORA-01653: 表xx无法通过 8192在表空间中扩展

向Oracle 19g数据库中批量插入数据&#xff0c;当插入近2亿条数据后&#xff0c;报出如下错误&#xff1a; ORA-01653: 表xx无法通过 8192 (在表空间 xx_data 中) 扩展 查看表空间&#xff0c;发现表空间大小已达到32G&#xff0c;表空间无法进行自动扩展了。&#xff08;初始…...

【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. 点击文档列表中的【打印】按钮&#xff0c;获取后台生成的PDF的url&#xff0c;弹窗进行预览&#xff1a; 2. 点击【打印】按钮&#xff0c;进行打印预览和打印&#xff1a; 二. 需求实现 首先后台给的是word文档&#xff0c;研究了一圈后发现暂时无法实现&…...

CSS学习记录07

CSS轮廓 轮廓是在元素周围绘制的一条线&#xff0c;在边框之外&#xff0c;以凸显元素。 CSS拥有如下轮廓属性&#xff1a; outline-styleoutline-coloroutline-widthoutline-offsetoutline 注意&#xff1a;轮廓与边框不同。不同之处在于&#xff1a;轮廓是在元素边框之外…...

喆塔科技携手国家级创新中心,共建高性能集成电路数智化未来

集创新之力成数智之塔 近日&#xff0c;喆塔科技与国家集成电路创新中心携手共建“高性能集成电路数智化联合工程中心”并举行签约揭牌仪式。出席此次活动的领导嘉宾包含&#xff1a;上海市经济和信息化委员会、上海市集成电路行业协会、复旦大学微电子学院、国家集成电路创新中…...

基于单片机的汽车雨刷器装置

摘要 下雨天时道路十分模糊&#xff0c;能见度非常低&#xff0c;司机分散注意力去手动打开雨刷器开关会非常危险。据统计&#xff0c;全世界雨天行车的车祸事故有7&#xff05;是因为司机手动打开雨刷分心导致的。为了减小司机因为手动打开雨刷发生车祸的概率&#xff0c;所以…...

013-SpringBoot 定义优雅的全局异常处理方式

SpringBoot 定义优雅的全局异常处理方式 一、概述二、定义全局异常接口三、定义全局异常枚举四、定义全局基础异常五、定义全局基础业务异常六、定义全局返回七、定义全局返回工厂八、全局异常处理九、实体类十、Controller十一、效果展示一、概述 在日常项目开发中,异常是常…...

nginx 网页正常访问 F5 404

前端打包部署完&#xff0c;无论pc-web或h5-wap&#xff0c;访问正常&#xff0c;一刷新就会404。 解决方案&#xff1a; 在项目的nginx子配置文件中&#xff0c;加上以下代码 try_files $uri $uri/ /index.html;...

Idea Spring Initializr没有 Java 8选项解决办法

问题描述 在使用IDEA中的Spring Initializr创建新项目时&#xff0c;Java 版本近可选择Java17,21 。不能选择Java8;SpringBoot 版本也只有 3.x 问题原因 Spring 官方&#xff08; https://start.spring.io/&#xff09;不再提供旧版本的初始化配置 解决方案 方案 1 使用阿里…...

【Leetcode Top 100】104. 二叉树的最大深度

问题背景 给定一个二叉树 r o o t root root&#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 数据约束 树中节点的数量在 [ 0 , 1 0 4 ] [0, 10 ^ 4] [0,104] 区间内。 − 100 ≤ N o d e . v a l ≤ 100 -100 \le Nod…...

C#实现一个HttpClient集成通义千问-开发前准备

集成一个在线大模型&#xff08;如通义千问&#xff09;&#xff0c;来开发一个chat对话类型的ai应用&#xff0c;我需要先了解OpenAI的API文档&#xff0c;请求和返回的参数都是以相关接口文档的标准进行的 相关文档 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是很复杂的&#xff0c;若依简化了了此操作apach poi的上传速率和下载速率都是没有优化的&#xff0c;依赖于文件大小的限制在此前提下&#xff0c;如果没法满足客户的需求&#xff08;超大型文件的上传&am…...

去除背景 学习笔记

目录 rembg rembg 安装&#xff1a; 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 -- 隔离级别简介(原理篇)

隔离级别 别记题记隔离级别后记系列文章 别记 烧香拜佛要是有用&#xff0c;还需要我们来过吗…从个人情感角度&#xff0c;巴沙尔阿萨德 辜负了东大对他的期望他可是从正门踏进了灵隐寺 俄乌战争即将进入第三年&#xff08;此时202412&#xff09;此时的加沙正成为以色列建国…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...