如何利用redis使用一个滑动窗口限流

介绍

滑动窗口限流就是,就是表示在一定时间之内,至多有多少请求能够进来,然后通过移动这个窗口来接收后续的请求。

Redis的实现方式

使用redis的zset的数据结构,

redis的key为 xx

score 为时间戳

Member 为请求详情

比如登录1分钟之内不能大于100

我们在登陆的时候,获取当前时间,

然后获取滑动窗口开始的时间,当前时间-60s

然后把小于开始时间的全部删除

之后获取当前请求的数量是否大于100

不大于则可以

java 复制代码
import redis.clients.jedis.Jedis;

public class SlidingWindowRateLimiter {
    private Jedis jedis;
    private String key;
    private int limit;

    public boolean allowRequest(String key) {
        //当前时间戳
        long currentTime = System.currentTimeMillis();
        //窗口开始时间是当前时间减60s
        long windowStart = currentTime - 60 * 1000;
        //删除窗口开始时间之前的所有数据
        jedis.zremrangeByScore(key, "-inf", String.valueOf(windowStart));
        //计算总请求数
        long currentRequests = jedis.zcard(key);
        //窗口足够则把当前请求加入
        if (currentRequests < limit) {
            jedis.zadd(key, currentTime, String.valueOf(currentTime));
            return true;
        }

        return false;
    }
}

ZREMRANGEBYSCORE

这个命令可以删除 一个区间的数据,

ZREMRANGEBYSCORE key min max

Redisson实现的限流

基于令牌桶实现的一个限流器

相关推荐
island13143 小时前
【Redis#10】渐进式遍历 | 数据库管理 | redis_cli | RES
数据库·redis·bootstrap
心想事成的幸运大王3 小时前
Redis的过期策略
数据库·redis·缓存
倔强的石头_3 小时前
CentOS 上安装KingbaseES(ISO包)详细教程
数据库
2401_897930064 小时前
使用Docker轻松部署Neo4j图数据库
数据库·docker·neo4j
诗句藏于尽头4 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
寻星探路5 小时前
数据库造神计划第六天---增删改查(CRUD)(2)
java·大数据·数据库
盖世英雄酱581366 小时前
Read timed out问题 排查
java·数据库·后端
云动雨颤7 小时前
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
数据库·spring boot·tomcat
RestCloud7 小时前
Kafka实时数据管道:ETL在流式处理中的应用
数据库·kafka·api