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时,它不大于上次请求10后的过期时间6;但在17时为true;而最后一个请求是针对用户1的,所以初始请求为false。

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

定义构造函数。这将接收expire参数。

  • lastCall := 创建一个字典,其默认值为-1。
  • 定义函数limit()。这将接收uid和timestamp参数。
  • last := lastCall[uid]
  • 如果last等于-1或(last + expire) <= timestamp,则
    • lastCall[uid] := timestamp
    • 返回False
  • 返回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

更新于:2021年10月14日

70 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.