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);
}
相关推荐
凤山老林2 小时前
ORM 框架性能调优:Spring Boot 下 N+1 查询根因治理、动态 SQL 优化与 Fetch 策略实战
数据库·spring boot·sql
是梦终空2 小时前
计算机毕业设计279—基于SpringBoot+Vue3校园商户意见反馈系统(源代码+数据库+17000字论文+ppt)
数据库·spring boot·vue·毕业设计·课程设计·毕业论文·源代码
云技纵横3 小时前
Redis 延迟双删还是读到脏数据?一次缓存一致性事故
redis·后端·面试
952364 小时前
RabbitMQ - 高级特性
java·spring boot·分布式·后端·rabbitmq
早春的树长在理想三旬4 小时前
从LLM到Agent:ReAct推理模式的底层原理
人工智能·spring boot·springai·agent开发
存在的五月雨5 小时前
SpringBoot后端限制重复提交
java·spring boot·后端
AskHarries5 小时前
Redis 应该什么时候上
redis
桑榆肖物5 小时前
在 .NET MAUI 里接入 PP-OCRv6 文本检测实现查找并点击
数据库·redis·.net·maui
手握风云-5 小时前
Redis:不只是缓存那么简单(十四)
redis·缓存
前鼻音太阳熊5 小时前
【MES系统】MES为什么需要SSE?从设备实时监控谈Spring Boot流式推送设计
java·spring boot·后端