Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình xác định cấu trúc dữ liệu hỗ trợ kiểm tra giới hạn tốc độ cho người dùng bằng Python

Giả sử chúng ta muốn phát triển một cấu trúc dữ liệu có thể xây dựng theo thời gian hết hạn và hỗ trợ một hàm lấy id người dùng và dấu thời gian. Thao tác này sẽ kiểm tra xem người dùng có user_id đã cho tại thời điểm đã cho dấu thời gian mà yêu cầu có thất bại hay không. Nó sẽ chỉ thất bại khi người dùng có một yêu cầu thành công ít hơn thời gian hết hạn đã cho trước đó.

Vì vậy, nếu đầu vào giống như expire =6 thì hãy xây dựng một đối tượng obj và gọi các hàm obj.limit (0,10), obj.limit (0,16), obj.limit (0,17) và obj.limit ( 1,20), thì kết quả đầu ra sẽ lần lượt là Sai, Sai, Đúng và Sai vì đối với người dùng 0, ban đầu không có yêu cầu nào ở đó nên nó là sai, sau đó tại thời điểm 16, nó không lớn hơn thời gian hết hạn 6 so với yêu cầu cuối cùng 10, nhưng ở tuổi 17 thì đúng và đối với yêu cầu cuối cùng, nó dành cho người dùng 1 nên yêu cầu ban đầu là sai.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

Xác định hàm tạo. Điều này sẽ hết hạn

  • lastCall:=tạo một từ điển có giá trị mặc định là -1
  • Xác định giới hạn hàm (). Điều này sẽ có uid, dấu thời gian
  • last:=lastCall [uid]
  • nếu cuối cùng giống -1 hoặc (cuối cùng + hết hạn) <=dấu thời gian, thì
    • lastCall [uid]:=timestamp
    • trả về Sai
  • trả về True

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

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))

Đầu vào

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

Đầu ra

False
False
True
False