基于Redis实现限流

ops/2025/3/14 21:37:46/

限流尽可能在满足需求的情况下越简单越好!

1、基于Redsi的increment方法实现固定窗口限流

  • Redis的increment方法保证并发线程安全
  • 窗口尽可能越小越好(太大可能某一小段时间就打满请求剩下的都拿不到令牌了)
  • 这个原理其实就是用当前时间戳然后除窗口大小 在这个窗口大小的时间内 key都一样
public class RedisRateLimiter {private final StringRedisTemplate redisTemplate;// 命令前缀private final String key;private final int rate;private final int window;public RedisRateLimiter(StringRedisTemplate redisTemplate, String key, int rate,int window) {this.redisTemplate = redisTemplate;this.key = key;this.rate = rate;Assert.isTrue(window > 0 && window <= 60,"窗口只支持分钟内");this.window = window;}// 检查并获取令牌public boolean acquire() {String currentKey = key + "_" + (DateUtil.currentSeconds() / window);Long currentCount = redisTemplate.opsForValue().increment(currentKey);redisTemplate.expire(currentKey, window, TimeUnit.SECONDS);if (currentCount > rate){return false;}return true;}public void acquireSleep() {int count = 0;while (!acquire()){ThreadUtil.sleep(1,TimeUnit.SECONDS);count++;log.info("RedisRateLimiter[{}] try acquire sleep {}",key,count);}}public boolean acquireSleep(int waitSecond) {int count = 0;while (!acquire()){if (count >= waitSecond){return false;}ThreadUtil.sleep(1,TimeUnit.SECONDS);count++;log.info("RedisRateLimiter[{}] try acquire sleep {}",key,count);}return true;}}

使用案例:

下面这个任务是实时请求评论和子评论接口,但是两个接口每分钟不能超过100,所以我们使用限流限制10秒不超过18即可也能满足需求。

public class ScCommentRealTimeSyncTask  {private RedisRateLimiter rateLimiter;@PostConstructpublic void init(){rateLimiter = newRedisRateLimiter(stringRedisTemplate,KAOLA_COMMENT_RATE_KEY,16,10);}@Scheduled(fixedDelay = 3000)public void task(){// 请求接口1rateLimiter.acquireSleep();request1();//请求接口2rateLimiter.acquireSleep();request2();}}


http://www.ppmy.cn/ops/165480.html

相关文章

视频推拉流:EasyDSS平台直播通道重连转推失败原因排查与解决

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 用户使用EasyDSS平台对直播通道进行转推&#xff0c;发现只要关闭…

机器学习—赵卫东阅读笔记(一)

第一章&#xff1a;机器学习基础 1.1.2 机器学习主要流派 1.符号主义 2.贝叶斯分类——基础是贝叶斯定理 3.联结主义——源于神经学&#xff0c;主要算法是神经网络。——BP算法&#xff1a;作为一种监督学习算法&#xff0c;训练神经网络时通过不断反馈当前网络计算结果与…

vb编程有哪些相关的IDE开发工具vb.net,Basic语言?

在编程领域&#xff0c;VB 系列拥有丰富多样的 IDE 开发工具&#xff0c;为不同需求的开发者提供了广泛的选择&#xff0c;以下为你详细介绍&#xff1a; 兼容 VB6 源码的开发工具 twinbasic&#xff1a;属于 VB7 系列&#xff0c;它几乎能 100% 兼容 VB6 源码&#xff0c;这…

doris:ClickHouse

Deepseek R1 提供的 3D 迷宫设计方案是一个结合虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和物理迷宫的创新项目&#xff0c;旨在为用户提供沉浸式体验。以下是该设计方案的详细讲解&#xff1a; 1. 设计目标 沉浸式体验&#xff1a;通过 3D 技…

鸿蒙ArkTs如何实现v-html的功能,显示富文本内容?

鸿蒙ArkTs如何实现v-html的功能&#xff0c;显示富文本内容&#xff1f; 先看效果前言功能介绍解决方案hp-richtext介绍hp-richtext 组件是如何实现的&#xff1f;下载安装代码示例richTextOption属性自定义 parser 函数具体介绍imageProp 对象具体属性 我在使用中遇到的问题问…

微信小程序-实现锚点跳转,页面加载后自动跳转、点击跳转到指定位置

一、页面加载后滚动到指定位置&#xff0c;onLoad或onReady里执行。 scrollAfterLoading() {const query wx.createSelectorQuery()query.select(#cont1).boundingClientRect()query.selectViewport().scrollOffset()query.exec(function (res) {wx.pageScrollTo({scrollTop:…

hadoop第3课(hdfs shell常用命令)

一、Hadoop FS 基础操作命令 1. 查看帮助 hadoop fs -help [命令名] # 查看具体命令的帮助文档 # 示例&#xff1a; hadoop fs -help mkdir2. 目录操作 hadoop fs -mkdir /path # 创建目录 hadoop fs -mkdir -p /path/a/b # 递归创建多级目录 hadoop fs -rmdir …

高阶哈希算法

SHA-256简介 SHA-256 是 **SHA-2&#xff08;Secure Hash Algorithm 2&#xff09;**家族中的一种哈希算法&#xff0c;由美国国家安全局设计&#xff0c;并于 2001 年发布。它能够将任意长度的数据映射为一个固定长度256 位&#xff0c;即 32 字节的哈希值&#xff0c;通常以…