python redis实现令牌桶限流代码
代码语言:python
所属分类:其他
代码描述: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