java Redisson 实现限流每秒/分钟/小时限制N个
1.引入maven包:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.11.1</version></dependency>
2.代码实现:
a.RedissonConfig 初始化
package com.hanyc.demo.config;import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.ArrayList;
import java.util.List;/*** redisson** @author hanyc* @date 2024/12/31 13:30* @company: */
@Configuration
public class RedissonConfig {@Autowiredprivate RedisProperties redisProperties;@Beanpublic RedissonClient redissonClient() {Config config = new Config();if (redisProperties.getCluster() != null && !redisProperties.getCluster().getNodes().isEmpty()) {RedisProperties.Cluster cluster = redisProperties.getCluster();List<String> nodes = cluster.getNodes();List<String> newNodes = new ArrayList<>();nodes.forEach(index -> newNodes.add(index.startsWith("redis://") ? index : "redis://" + index));config.useClusterServers().addNodeAddress(newNodes.toArray(new String[0])).setPassword(redisProperties.getPassword());} else {String address = "redis://" + redisProperties.getHost() + ":" + redisProperties.getPort();config.useSingleServer().setAddress(address).setPassword(redisProperties.getPassword());}RedissonClient redisson = Redisson.create(config);return redisson;}
}
b.UserRateLimiterInterceptor 用户请求限流拦截器
package com.hanyc.demo.config;import cn.hutool.extra.servlet.ServletUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** @Description: 用户请求限流拦截器* @Author hanyc* @Date 2024/12/12**/
@Component
@Slf4j
public class UserRateLimiterInterceptor implements HandlerInterceptor {@Autowiredprivate RedissonClient redissonClient;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 假设这个方法能够从请求中解析出用户IDString userIdStr = "";String userIp = ServletUtil.getClientIP(request);// 假设用户ID 为 1String userId = "1";if (userId == null) {// 所有未登录账号 不需要验证的请求,都使用userId=10000userIdStr = userIp;} else {userIdStr = userId.toString();}// 为每个用户生成唯一的限流键String rateLimiterKey = "USER_RATE_LIMITER" + userIdStr;// 删除 Redis 中存储的限流器状态(清除缓存)// RRateLimiter 在内部将配置保存在 Redis 中,并且这些配置是持久化的。删除该键后,Redis 会丢失之前存储的限流配置,从而确保新的配置能够被应用。redissonClient.getBucket(rateLimiterKey).delete();// 获取分布式的 RRateLimiter 实例RRateLimiter rateLimiter = redissonClient.getRateLimiter(rateLimiterKey);// 初始化限流器,限制每两秒最多 10 次请求// 参数说明: // RateType.OVERALL 全局// rate 时间限制内可以请求多少次// rateInterval 多少时间内限制// 时间单位 可以秒/分钟/小时等rateLimiter.trySetRate(RateType.OVERALL, 10, 2, RateIntervalUnit.SECONDS);log.info("当前路由为:{} userIdStr:{} userIp:{}", request.getRequestURI(), userIdStr, userIp);// 尝试获取令牌,如果获取不到说明超过请求限制if (rateLimiter.tryAcquire()) {// 允许继续处理请求return true;} else {// 如果获取不到令牌,则说明请求超过了限制,可以在这里抛出异常或者返回错误信息log.warn("当前异常的路由为:{} userIdStr:{} userIp :{}", request.getRequestURI(), userIdStr, userIp);return false;}}}
c. WebMvcConfig 添加自定义拦截器
package com.hanyc.demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** MVC自定义配置** @author hanyc*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {@Beanpublic UserRateLimiterInterceptor userRateLimiterInterceptor() {return new UserRateLimiterInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(userRateLimiterInterceptor()).addPathPatterns("/**");}
}
3.测试
使用JMeter 发送请求. 每秒15个.

查看打印结果:
前10个请求正常响应. 后五个请求被拦截

相关文章:
java Redisson 实现限流每秒/分钟/小时限制N个
1.引入maven包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>red…...
【漫话机器学习系列】029.累积分布函数(Cumulative Distribution Function)
累积分布函数(Cumulative Distribution Function, CDF) 累积分布函数(CDF)是概率论和统计学中的一个基本概念,用于描述随机变量取值的累积概率分布情况。它在理论研究和实际应用中广泛使用。 定义 给定随机变量 X&am…...
设计模式之访问者模式:一楼千面 各有玄机
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 一、访问者模式概述 \quad 江湖中有一个传说:在遥远的东方,有一座神秘的玉楼。每当武林中人来访,楼中的各个房…...
AI 编程的世界:用Cursor编写评分项目
AI 编程的世界:用Cursor编写评分项目 今天是2024年的最后一天,祝大家在新的一年,健康开心快乐! 岁末之际,星辰为伴,灯火长明,我终于在 2024 年的最后一天成功上线了 AI 编程项目。回首这一年&am…...
Cesium教程(二十三):Cesium实现下雨场景
文章目录 实现效果代码引入js文件创建容器创建视图定义下雨场景完整代码下载实现效果 代码 在 Cesium 中利用PostProcessStageLibrary实现下雪场景,你可以按照以下步骤进行: 创建一个 PostProcessStage:首先,你需要创建一个PostProcessStage对象,它将用于定义下雪效果的渲…...
SpringCloudAlibaba技术栈-Higress
1、什么是Higress? 云原生网关,干啥的?用通俗易懂的话来说,微服务架构下Higress 就像是一个智能的“交通警察”,它站在你的网络世界里,负责指挥和调度所有进出的“车辆”(也就是数据流量)。它的…...
uniapp 微信小程序开发使用高德地图、腾讯地图
一、高德地图 1.注册高德地图开放平台账号 (1)创建应用 这个key 第3步骤,配置到项目中locationGps.js 2.下载高德地图微信小程序插件 (1)下载地址 高德地图API | 微信小程序插件 (2)引入项目…...
Springboot:后端接收数组形式参数
1、接收端写法 PermissionAnnotation(permissionName "",isCheckToken true)PostMapping("/batchDeleteByIds")public ReturnBean webPageSelf( NotNull(message "请选择要删除的单据!") Long[] ids) {for (Long string : ids) {l…...
Postman[2] 入门——界面介绍
可参考官方 文档 Postman 导航 | Postman 官方帮助文档中文版Postman 拥有各种工具、视图和控件,帮助你管理 API 项目。本指南是对 Postman 主要界面区域的高级概述:https://postman.xiniushu.com/docs/getting-started/navigating-postman 1. Header&a…...
1月第四讲:Java Web学生自习管理系统
一、项目背景与需求分析 随着网络技术的不断发展和学校规模的扩大,学生自习管理系统的需求日益增加。传统的自习管理方式存在效率低下、资源浪费等问题,因此,开发一个智能化的学生自习管理系统显得尤为重要。该系统旨在提高自习室的利用率和…...
【Redis】Redis 典型应用 - 缓存 (cache)
目录 1. 什么是缓存 2. 使用 Redis 作为缓存 3. 缓存的更新策略 3.1 定期生成 3.2 实时生成 4. 缓存的淘汰策略 5. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿 关于缓存预热 (Cache preheating) 关于缓存穿透 (Cache penetration) 关于缓存雪崩 (Cache avalanche) 关…...
HTML——38.Span标签和字符实体
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>span标签和字符实体</title><style type"text/css">h1{text-align: center;}p{text-indent: 2em;}span{color: red;}</style></head><…...
ROS2+OpenCV综合应用--10. AprilTag标签码追踪
1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上,增加了小车摄像头云台运动的功能,摄像头会保持标签码在视觉中间而运动,根据这一特性,从而实现标签码追踪功能。 2. 启动 2.1 程序启动前的准备 本次apriltag标签码使…...
python Celery 是一个基于分布式消息传递的异步任务队列系统
Celery 是一个基于分布式消息传递的异步任务队列系统,主要用于处理耗时任务、定时任务和周期性任务。它能够将任务分配到多个工作节点(Worker)上执行,从而提高应用程序的性能和可扩展性。Celery 是 Python 生态中最流行的任务队列…...
嵌入式硬件杂谈(七)IGBT MOS管 三极管应用场景与区别
引言:在现代嵌入式硬件设计中,开关元件作为电路中的重要组成部分,起着至关重要的作用。三种主要的开关元件——IGBT(绝缘栅双极型晶体管)、MOSFET(金属氧化物半导体场效应晶体管)和三极管&#…...
麒麟信安云在长沙某银行的应用入选“云建设与应用领航计划(2024)”,打造湖湘金融云化升级优质范本
12月26日,2024云计算产业和标准应用大会在北京成功召开。大会汇集政产学研用各方专家学者,共同探讨云计算产业发展方向和未来机遇,展示云计算标准化工作重要成果。 会上,云建设与应用领航计划(2024)建云用…...
好用的随机生成图片的网站
官网: Lorem Picsum 获取自定义大小的随机图像 https://picsum.photos/200/300 获取正方形图像 https://picsum.photos/200 获取特定类型的图像 通过添加到 /id/{image} url 的开头来获取特定图像。 https://picsum.photos/id/237/200/300 获取静态随机图像…...
添加 env 配置,解决import路径问题
添加 env 配置,解决import路径问题 { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387 “version”: “0.2.0”, “configurations”: [ {"name&q…...
Go work stealing 机制
Go语言的Work Stealing(工作窃取)机制是一种用于调度Goroutines(协程)的策略,其核心目的是最大化CPU使用率,减少任务调度的开销,并提高并发性能和吞吐量。以下是Go Work Stealing机制的详细解释…...
基础数据结构--二叉树
一、二叉树的定义 二叉树是 n( n > 0 ) 个结点组成的有限集合,这个集合要么是空集(当 n 等于 0 时),要么是由一个根结点和两棵互不相交的二叉树组成。其中这两棵互不相交的二叉树被称为根结点的左子树和右子树。 如图所示&am…...
3步极速焕新Windows!零基础用Win11Debloat让系统快如闪电
3步极速焕新Windows!零基础用Win11Debloat让系统快如闪电 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and…...
告别Python!用C语言和llama.cpp API打造你的第一个本地大模型应用(附完整代码)
从Python到C语言:用llama.cpp构建高性能大模型推理引擎 当Python成为大模型开发的主流选择时,性能瓶颈也随之而来。对于需要低延迟、高吞吐的生产环境,C语言的性能优势开始显现。本文将带你从零开始,用llama.cpp的C API构建一个完…...
零基础入门CGCNN:3步用AI预测材料属性的神奇工具
零基础入门CGCNN:3步用AI预测材料属性的神奇工具 【免费下载链接】cgcnn Crystal graph convolutional neural networks for predicting material properties. 项目地址: https://gitcode.com/gh_mirrors/cg/cgcnn 想用人工智能预测新材料性能却不知从何入手…...
解锁高效操作:5款菜单栏管理工具的深度评测与场景适配指南
解锁高效操作:5款菜单栏管理工具的深度评测与场景适配指南 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice macOS菜单栏作为系统交互的核心界面,随着应用增多常陷入混乱&#…...
三步实现Joy-Con模拟Xbox手柄:解决低成本游戏外设适配难题
三步实现Joy-Con模拟Xbox手柄:解决低成本游戏外设适配难题 【免费下载链接】XJoy 项目地址: https://gitcode.com/gh_mirrors/xjo/XJoy 在游戏世界中,拥有合适的控制器往往能带来截然不同的体验。然而,专用游戏手柄动辄数百元的价格让…...
AI专著写作工具盘点,快速生成、润色,满足你的所有需求
学术专著创作:在深度与广度间寻求平衡及AI工具助力 撰写学术专著时,我们必须在“内容深度”与“覆盖广度”之间寻求一种理想的平衡,这也是许多研究者面临的一个挑战。从深度的角度来看,AI写专著需要具备扎实的学术基础࿰…...
保姆级教程:用AntV L7快速搭建可交互的3D地图(附四川地图JSON数据下载)
从零构建3D地图可视化:AntV L7实战指南与四川地貌呈现 第一次看到3D地图在城市规划、气象监测或商业分析中的应用时,那种立体数据跃然屏上的震撼感,让我立刻想动手尝试。作为蚂蚁集团推出的地理空间数据可视化引擎,AntV L7确实能让…...
3步解锁旧内核:KernelSU在Linux 4.14+设备上的完整适配指南
3步解锁旧内核:KernelSU在Linux 4.14设备上的完整适配指南 【免费下载链接】KernelSU A Kernel based root solution for Android 项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU 你是否还在为Android设备的内核版本过低而无法使用KernelSU感到…...
从‘单打独斗’到‘团队协作’:实战解析如何将DeepSeek的文本能力与Gemini的多模态API组合使用
从‘单打独斗’到‘团队协作’:实战解析如何将DeepSeek的文本能力与Gemini的多模态API组合使用 在AI技术日新月异的今天,开发者们常常面临一个困境:是选择专注于单一领域的强大模型,还是尝试整合多个模型的优势?这个问…...
Kandinsky-5.0-I2V-Lite-5s社区作品精选:看看其他开发者创造了什么
Kandinsky-5.0-I2V-Lite-5s社区作品精选:看看其他开发者创造了什么 1. 开篇:一场视觉创意的盛宴 Kandinsky-5.0-I2V-Lite-5s作为当前最热门的开源图像转视频模型,正在全球开发者社区掀起创作热潮。短短5秒就能将静态图片转化为富有生命力的…...
