如何利用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实现的限流

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

相关推荐
2401_83229810几秒前
存算分离2.0,阿里云EMR Serverless破解数据处理瓶颈
数据库
Maggie_ssss_supp5 分钟前
Linux-MySQL日志管理
数据库·mysql
喜欢吃豆9 分钟前
PostgreSQL 高维向量存储架构深度解析:架构限制、核心原理与行业解决方案
数据库·人工智能·postgresql·架构·2025博客之星
茁壮成长的露露11 分钟前
Percona Backup for MongoDB备份恢复操作
数据库·mongodb
l1t12 分钟前
一个在postgresql中运行很快,但是在duckdb中运行很慢的SQL
数据库·sql·postgresql·duckdb
曹牧15 分钟前
Oracle:增加十分钟
数据库·oracle
码界奇点19 分钟前
深入解析MySQL9主从复制架构详解从原理到实战
数据库·sql·架构·可用性测试
独自归家的兔28 分钟前
深度对比:PostgreSQL与MySQL的核心差异及选型指南
数据库·mysql·postgresql
结衣结衣.33 分钟前
Redis的基本全局命令以及数据类型和内部编码
数据库·redis·bootstrap
抠脚学代码39 分钟前
Qt与Linux
linux·数据库·qt