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);
}
相关推荐
工一木子4 分钟前
【Java项目脚手架系列】第七篇:Spring Boot + Redis项目脚手架
java·spring boot·redis
Chasing__Dreams3 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存
亚林瓜子3 小时前
Spring集成Redis中禁用主机名DNS检测
redis·spring·ssh
源码云商3 小时前
【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
数据库·vue.js·spring boot
zy happy4 小时前
搭建运行若依微服务版本ruoyi-cloud最新教程
java·spring boot·spring cloud·微服务·ruoyi
wowocpp6 小时前
spring boot Controller 和 RestController 的区别
java·spring boot·后端
独泪了无痕7 小时前
MongoTemplate 基础使用帮助手册
spring boot·mongodb
獨枭9 小时前
使用 163 邮箱实现 Spring Boot 邮箱验证码登录
java·spring boot·后端
维基框架9 小时前
Spring Boot 封装 MinIO 工具
java·spring boot·后端
秋野酱9 小时前
基于javaweb的SpringBoot酒店管理系统设计与实现(源码+文档+部署讲解)
java·spring boot·后端