java学习之使用redis简单实现限流功能

事先声明基于redis实现滑动时间窗实现限流这种方式我们工作中一般不会使用,因为目前市面上对于大体量的服务使用的都是springCloud netFlix或者spring CloundAlibaba(主流)他们都有各自的限流组件( Netflix Hystrix , sentinel), 小体量服务又基本用不到限流,这里可以当成是时间窗口算法的一种学习

滑动时间窗口限流是一种基于时间的流量控制策略,本质就是规定一个时间大小的窗口,值统计在这个窗口内的请求,然后滑动这个窗口;至于怎么滑动窗口,可以那请求的当前时间-设置的窗口大小来完成

具体实现:

主要步骤:

1.定义窗口的大小,如30秒

2.每次收到请求,就定义一个zset存储到redis中

3.然后通过ZREMVRANGBYSCORE命令来删除窗口起始时间之前的数据

4.最后通过ZCARD命令获取zset集合中的成员数量,及窗口内的请求量

public class SlidingWindowRateLimiter {
    private final Jedis jedis;
    public SlidingWindowRateLimiter(Jedis jedis) {
        this.jedis = jedis;
    }
    public boolean isAllowed(String key, int limit, long windowSize, long currentTime) {
        // 计算时间窗口的起始时间
        long windowStart = currentTime - windowSize;
        // 移除时间窗口之前的数据
        jedis.zremrangeByScore(k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值