openrstry 限流 是否有清零逻辑 连接池
openrstry 限流 是否有清零逻辑
https://github.com/openresty/lua-resty-limit-traffic
# encoding=utf-8
# Shawn 2020/4/28 10:31
from asgiref.sync import async_to_sync
class ABCBucketToken:
def __init__(self):
pass
def connect_bucket(self):
pass
def refresh_token(self):
pass
def check_token(self):
pass
def disconnect_bucket(self):
pass
def __del__(self):
pass
class BizBucketToken(ABCBucketToken):
factory_req_id = lambda k: 'BizBucketToken.' + k
class_var_bucket_created = False
def __init__(self, req_id='anonymoususer', limit=16, window_second=32):
self.req_id = BizBucketToken.factory_req_id(req_id)
self.limit = limit
self.window_second = window_second
# TODO
self.connect_bucket()
@classmethod
def connect_bucket(cls):
if cls.class_var_bucket_created:
return
# TODO cnf
# TODO check alive
def get_redis_conf():
return 'redis://:pwd@rcs.com:6379/2'
async def create_redis_pool(i: str):
import aioredis
pool = await aioredis.create_redis_pool(i)
return pool
redis_conf = get_redis_conf()
redis_pool = async_to_sync(create_redis_pool)(redis_conf)
cls.bucket = redis_pool
cls.class_var_bucket_created=True
def handle_token(self):
to_throttle = False
pttl = async_to_sync(self.bucket.pttl)(self.req_id)
if pttl == -2:
async_to_sync(self.bucket.set)(self.req_id, self.limit)
async_to_sync(self.bucket.pexpire)(self.req_id, self.window_second * 1000)
elif pttl == -1:
async_to_sync(self.bucket.pexpire)(self.req_id, self.window_second * 1000)
elif pttl == 0:
# TODO
pass
elif pttl > 0:
r = async_to_sync(self.bucket.get)(self.req_id)
r = int(r)
if r >= 1:
async_to_sync(self.bucket.set)(self.req_id, r - 1)
else:
to_throttle = True
return to_throttle
def disconnect_bucket(self):
pass
def __del__(self):
pass
if __name__ == 'main':
pass
连接池
uid = get_uid(request)
BizBucketToken.connect_bucket()
r = BizBucketToken(req_id=uid, limit=160, window_second=32)
to_throttle = r.handle_token()

浙公网安备 33010602011771号