python redis实现令牌桶限流代码

代码语言:python

所属分类:其他

代码描述:python redis实现令牌桶限流代码

代码标签: python redis 令牌桶 限流 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

#!/usr/local/python3/bin/python3
# -*- coding: utf-8 -*
import redis
import time

def can_pass_token_bucket(redis_conn, user, action, time_zone=60, times=30):
    # 请求是否通过令牌桶限流
    """
    :param user: 用户唯一标识
    :param action: 用户访问的接口标识(即用户在客户端进行的动作)
    :param time_zone: 接口限制的时间段
    :param times: 限制的时间段内允许多少请求通过
    """
    key = f'{user}:{action}'
    rate = times / time_zone  # 令牌生成速度
    capacity = times  # 桶容量

    now = time.time()
    with redis_conn.pipeline() as pipe:
        while True:
            try:
                # 监视键,以检测事务期间的更改
                pipe.watch(key)
                tokens = pipe.hget(key, 'nowtokens')
                last_time = pipe.hget(key, 'nowlast_time')
                tokens = int(tokens) if tokens else capacity
                last_time = float(last_time) if last_time else now

                delta_tokens = int((now - last_time) * rate)  # 经过一段时间后生成的令牌
                tokens = min(tokens + delta_tokens, capacity)  # 增加令牌,但不能超过桶容量
                last_time = now  # 记录令牌生成时间

                # 开始事务
                pipe.multi()
                pipe.hset(key, 'nowlast_time', last_time)
                pipe.hset(key, 'now.........完整代码请登录后点击上方下载按钮下载查看

网友评论0