基于 Redis 实现滑动窗口的限流

⏳ 限流场景:突发流量,恶意流量,业务本身需要

基于 Redis 实现滑动窗口的限流是一种常见且高效的做法。Redis 是一种内存数据库,具有高性能和支持原子操作的特点,非常适合用来实现限流功能。下面是一个使用 Redis 实现基于滑动窗口的限流算法的简单示例:

滑动窗口

📐其实这个方法就是把上边的粒度进行切分,切分成更小力度的计数器,就像是上边的切分成一小块一小块,每块时间超出了指定的请求就阻挡在外,越小力度,则限流越好。

import time
import redis

class SlidingWindowRateLimiter:
    def __init__(self, window_size, limit, redis_conn):
        self.window_size = window_size
        self.limit = limit
        self.redis_conn = redis_conn

    def allow_request(self, key):
        current_time = int(time.time() * 1000)
        pipeline = self.redis_conn.pipeline()
        pipeline.zadd(key, {current_time: current_time})
        pipeline.zremrangebyscore(key, '-inf', current_time - self.window_size)
        pipeline.expire(key, self.window_size / 1000 + 1)  # 设置过期时间,略大于窗口大小
        pipeline.execute()

        count = self.redis_conn.zcard(key)
        if count <= self.limit:
            return True
        else:
            return False

在这个示例中,我们利用 Redis 的有序集合(sorted set)来实现滑动窗口。每个请求到达时,都会向有序集合中添加当前时间戳,并通过 zremrangebyscore 方法移除超出时间窗口范围的时间戳。最后,通过 zcard 方法统计有序集合中的成员数量,从而判断是否允许新的请求。

需要注意的是,上述代码仅为示例,实际应用中可能需要考虑更多因素,比如分布式环境下的原子操作、并发访问的线程安全性、异常处理等。另外,在实际生产环境中,还可以结合 Lua 脚本和 Redis 的事务机制来实现更复杂的限流策略。

总之,基于 Redis 实现滑动窗口的限流是一种常见且高效的做法,可以有效地控制系统的并发访问量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值