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);
}
相关推荐
跟着珅聪学java2 小时前
spring boot +Elment UI 上传文件教程
java·spring boot·后端·ui·elementui·vue
我命由我123452 小时前
Spring Boot 自定义日志打印(日志级别、logback-spring.xml 文件、自定义日志打印解读)
java·开发语言·jvm·spring boot·spring·java-ee·logback
战族狼魂5 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
morris1317 小时前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
用键盘当武器的秋刀鱼9 小时前
springBoot统一响应类型3.5.1版本
java·spring boot·后端
爱的叹息9 小时前
spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)
redis
小李同学_LHY9 小时前
三.微服务架构中的精妙设计:服务注册/服务发现-Eureka
java·spring boot·spring·springcloud
weitinting9 小时前
Ali linux 通过yum安装redis
linux·redis
纪元A梦10 小时前
Redis最佳实践——首页推荐与商品列表缓存详解
数据库·redis·缓存
爱喝醋的雷达11 小时前
Spring SpringBoot 细节总结
java·spring boot·spring