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

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);
}

http://www.kler.cn/a/226770.html

相关文章:

  • 速盾:免备案网站服务器接入cdn有哪些好处
  • 校招春招,在线测评一般测试哪些内容?
  • 【论文阅读】Long-Tailed Recognition via Weight Balancing(CVPR2022)附MaxNorm的代码
  • VS打包.exe文件步骤
  • LLM 推理优化探微 (1) :Transformer 解码器的推理过程详解
  • 【Linux】理解系统中一个被打开的文件
  • LeetCode.1686. 石子游戏 VI
  • 深兰科技陈海波出席CTDC2024第五届首席技术官领袖峰会:“民主化AI”的到来势如破竹
  • 高效解决MySQL千万级大表数据清理难题的策略
  • 只用一台服务器部署上线(宝塔面板) 前后端+数据库
  • 使用 git 将本地文件上传到 gitee 远程仓库中,推送失败
  • electron项目在内网环境的linux环境下进行打包
  • 软件工程(最简式总结)
  • 华为---STP(二)---STP报文和STP端口状态
  • 初探分布式链路追踪
  • ansible的常用模块配置说明及批量部署服务
  • 【24美赛思路已出】2024年美赛A~F题解题思路已出 | 无偿自提
  • C语言指针的几种用途
  • React Hooks 学习笔记
  • 20240130在ubuntu20.04.6下卸载NVIDIA显卡的驱动