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

SpringBoot集成Redisson实现限流(二)

1. 简介

Springboot集成Redisson默认的限流器为令牌桶型限流器,底层是通过lua脚本去实现的。
通过lua脚本我们可以去实现一个滑动窗口限流器,利用ZSET格式数据就可以轻松实现。
springboot集成Redisson就不做讲解,可以参考:springboot集成redisson

2. 滑动窗口lua脚本讲解

-- 移除时间窗口之外的数据,通过ZSET自带的排序score可以轻松做到
redis.call('ZREMRANGEBYSCORE', KEYS[1], 0, tonumber(ARGV[2]) - tonumber(ARGV[3]));
-- 判断当前窗口是否达到限流限制 
if (redis.call('ZCARD', KEYS[1]) >= tonumber(ARGV[1])) then 
return nil; 
end; 
-- 添加对应的数据
redis.call('ZADD', KEYS[1], ARGV[2], ARGV[2]); 
-- 过期时间更新,防止key一直占用
redis.call('pexpire', KEYS[1], ARGV[3]); 
return true;

3. 调用

/*** 滑动窗口限流* @param key             限流key* @param threshold       阈值* @param interval        时间间隔* @param unit            单位* @return true-通过 false-限制*/
public static boolean rateLimiterSlidingWindow(String key, long threshold, long interval, TimeUnit unit) {RScript rScript = redissonClient.getScript();long now = System.currentTimeMillis();long intervalMs = TimeUnit.MILLISECONDS.convert(interval, unit);return rScript.eval(RScript.Mode.READ_WRITE, slidingWindowScript, RScript.ReturnType.BOOLEAN,Collections.singletonList(key), threshold, now, intervalMs);
}

相关文章:

  • QCustomplot实现灰度曲线图
  • 大型语言模型(LLM)的优势、劣势和风险
  • 计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • Elasticsearch:将文档级安全性 (DLS) 添加到你的内部知识搜索
  • 【前端web入门第四天】02 CSS三大特性+背景图
  • 【安卓跨程序共享数据,探究ContentProvider】
  • Codeforces Round 888 (Div. 3)补题
  • Springboot 整合 Elasticsearch(二):使用HTTP请求来操作ES
  • 路桥施工污废水处理需要哪些工艺设备
  • 数据图表方案,企业视频生产数据可视化
  • Leetcode刷题笔记题解(C++):257. 二叉树的所有路径
  • 下载已编译的 OpenCV 包在 Visual Studio 下实现快速配置
  • VS编译器对scanf函数不安全报错的解决办法(详细步骤)
  • LeetCode、790. 多米诺和托米诺平铺【中等,二维DP,可转一维】
  • 安卓动态链接库文件体积优化探索实践
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • codis proxy处理流程
  • Hibernate【inverse和cascade属性】知识要点
  • Javascript编码规范
  • KMP算法及优化
  • maya建模与骨骼动画快速实现人工鱼
  • MobX
  • Mocha测试初探
  • spark本地环境的搭建到运行第一个spark程序
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • yii2权限控制rbac之rule详细讲解
  • 从重复到重用
  • 前端之Sass/Scss实战笔记
  • 使用common-codec进行md5加密
  • 微信小程序设置上一页数据
  • 【云吞铺子】性能抖动剖析(二)
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​如何防止网络攻击?
  • !!Dom4j 学习笔记
  • #pragma once
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (1)bark-ml
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (ibm)Java 语言的 XPath API
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (规划)24届春招和25届暑假实习路线准备规划
  • (十六)一篇文章学会Java的常用API
  • (一)WLAN定义和基本架构转
  • (一)基于IDEA的JAVA基础12
  • (转)Scala的“=”符号简介
  • (转)使用VMware vSphere标准交换机设置网络连接
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .net core Swagger 过滤部分Api
  • .NET 指南:抽象化实现的基类
  • .NET/C# 的字符串暂存池
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET下ASPX编程的几个小问题
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /proc/stat文件详解(翻译)