SpringBoot集成Redisson实现限流(二)

1. 简介

Springboot集成Redisson默认的限流器为令牌桶型限流器,底层是通过lua脚本去实现的。

通过lua脚本我们可以去实现一个滑动窗口限流器,利用ZSET格式数据就可以轻松实现。

springboot集成Redisson就不做讲解,可以参考:springboot集成redisson

2. 滑动窗口lua脚本讲解

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. 调用

java 复制代码
/**
 * 滑动窗口限流
 * @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);
}
相关推荐
没有bug.的程序员39 分钟前
Spring Cloud Gateway 性能优化与限流设计
java·spring boot·spring·nacos·性能优化·gateway·springcloud
q***71854 小时前
海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
java·前端·spring boot
oneslide4 小时前
Kubernetes环境部署Redis集群
redis·容器·kubernetes
是垚不是土6 小时前
构建高可用Redis:哨兵模式深度解析与Nacos微服务适配实践
redis·微服务·bootstrap
KYumii6 小时前
智慧判官-分布式编程评测平台
vue.js·spring boot·分布式·spring cloud·java-rabbitmq
user_admin_god6 小时前
企业级管理系统的站内信怎么轻量级优雅实现
java·大数据·数据库·spring boot
q***82916 小时前
Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决
java·spring boot·logback
码码哈哈0.07 小时前
Vue 3 + Vite 集成 Spring Boot 完整部署指南 - 前后端一体化打包方案
前端·vue.js·spring boot
百***844510 小时前
SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)
spring boot·tomcat·mybatis
q***718510 小时前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis