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

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

相关推荐
数据知道39 分钟前
Go基础:用Go语言操作MySQL详解
开发语言·数据库·后端·mysql·golang·go语言
krielwus1 小时前
Oracle 11g R2 物理冷备
数据库·oracle
Li zlun3 小时前
MySQL 管理与配置详解:从安装到架构解析
数据库·mysql·架构
养生技术人3 小时前
Oracle OCP认证考试题目详解082系列第50题
运维·数据库·sql·oracle·database·开闭原则
学Java的bb3 小时前
苍穹外卖-缓存商品、购物车功能
缓存
不良人天码星3 小时前
使用Java连接redis以及开放redis端口的问题
java·开发语言·redis
马克学长3 小时前
SSM村务管理系统s2qnw(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·服务器·数据库
对着晚风做鬼脸3 小时前
MySQL 运维知识点(十五)---- 分库分表与MyCat
运维·数据库·mysql
元气满满的霄霄4 小时前
Spring Boot整合缓存——Ehcache缓存!超详细!
java·spring boot·后端·缓存·intellij-idea
数据知道4 小时前
Go基础:用Go语言操作redis详解
开发语言·数据库·redis·golang·go语言