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

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

相关推荐
知行合一。。。4 小时前
RAG--03--Milvus基本用法
数据库·oracle·milvus
TDengine (老段)4 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
上学的小垃圾5 小时前
01-数据库系统概述
数据库
二进制漫游记6 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996226 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
莫得感情 o6 小时前
Redis 05 · 持久化:RDB 与 AOF 怎么保证数据不丢
redis·缓存
curd_boy7 小时前
【Redis】Redis从缓存到AI向量平台
人工智能·redis·缓存
kiracrimson7 小时前
从缓存的角度看链表与线性表的差异
数据结构·链表·缓存
泡干脆面就番茄8 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
莫得感情 o8 小时前
Redis 02 · 数据结构:String 到 Stream 怎么选
redis