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);
}
相关推荐
刘~浪地球3 分钟前
Redis 从入门到精通(十五):安全配置与性能优化
redis·安全·性能优化
小江的记录本12 分钟前
【JEECG Boot】 JEECG Boot 数据字典管理——六大核心功能(内含:《JEECG Boot 数据字典开发速查清单》)
java·前端·数据库·spring boot·后端·spring·mybatis
小江的记录本12 分钟前
【JEECG Boot】 JEECG Boot——Online表单 系统性知识体系全解
java·前端·spring boot·后端·spring·低代码·mybatis
希望永不加班22 分钟前
SpringBoot 邮件发送:文本邮件与 HTML 邮件
java·spring boot·后端·spring·html
一个有温度的技术博主10 小时前
Redis主从同步原理:从全量同步到增量同步的完整解析
redis·分布式·缓存
小红的布丁11 小时前
单线程 Redis 的高性能之道
redis·后端
惜茶12 小时前
vue+SpringBoot(前后端交互)
java·vue.js·spring boot
NHuan^_^14 小时前
SpringBoot3 整合 SpringAI 实现ai助手(记忆)
java·人工智能·spring boot
han_hanker15 小时前
springboot 一个请求的顺序解释
java·spring boot·后端
MaCa .BaKa15 小时前
44-校园二手交易系统(小程序)
java·spring boot·mysql·小程序·maven·intellij-idea·mybatis