用Python定义支持用户速率限制检查的数据结构

用Python定义支持用户速率限制检查的数据结构

假设我们想要开发一个数据结构,可以在到期时间之内建立,支持一个函数,该函数采用用户ID和时间戳。这将检查特定用户ID在给定时间戳时请求是否失败。只有当用户的最后一次请求在给定的过期时间内时,请求才会失败。

因此,如果输入的参数是expire = 6,则构建一个对象obj,并调用函数obj.limit(0,10),obj.limit(0,16),obj.limit(0,17)和obj.limit(1,20),那么输出将分别为False,False,True和False,因为对于用户0,最初没有请求,所以是false,然后在时间16时,它不大于上次请求的过期时间6,但在17时为true,最后一次请求是用于用户1,因此最初的请求是false。

为了解决这个问题,我们将采取以下步骤:

定义构造函数。这将采用expire。

  • lastCall :创建默认值为-1的字典
  • 定义一个函数limit()。这将需要uid,timestamp
  • last : lastCall[uid]
  • 如果last与-1相同或(last + expire) <= timestamp,那么
    • lastCall[uid] := timestamp
    • return False
  • return True

示例

让我们看下面的实现以便更好地理解。

from collections import defaultdict
class RateLimit:
   def __init__(self, expire):
      self.expire = expire
      self.lastCall = defaultdict(lambda: -1)
   def limit(self, uid, timestamp):
      last = self.lastCall[uid]
      if last == -1 or last + self.expire <= timestamp:
         self.lastCall[uid] = timestamp
         return False
      return True

expire = 6
obj = RateLimit(expire)
print(obj.limit(0,10))
print(obj.limit(0,16))
print(obj.limit(0,17))
print(obj.limit(1,20))

输入

RateLimit(6)
obj.limit(0,10)
obj.limit(0,16)
obj.limit(0,17)
obj.limit(1,20)

输出

False
False
True
False

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程