Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมกำหนดโครงสร้างข้อมูลที่รองรับการตรวจสอบการจำกัดอัตราสำหรับผู้ใช้ใน Python


สมมติว่าเราต้องการพัฒนาโครงสร้างข้อมูลที่สามารถสร้างขึ้นด้วยเวลาหมดอายุ และสนับสนุนฟังก์ชันที่ใช้ ID ผู้ใช้และการประทับเวลา การดำเนินการนี้จะตรวจสอบว่าผู้ใช้ที่มี user_id ที่ระบุ ณ เวลาที่กำหนด คำขอล้มเหลวหรือไม่ จะล้มเหลวก็ต่อเมื่อผู้ใช้มีคำขอที่ประสบความสำเร็จน้อยกว่าเวลาหมดอายุที่กำหนดที่ผ่านมา

ดังนั้นหากอินพุตเหมือนหมดอายุ =6 ให้สร้างวัตถุ obj และเรียกใช้ฟังก์ชัน obj.limit(0,10), obj.limit(0,16), obj.limit(0,17) และ obj.limit( 1,20) จากนั้นผลลัพธ์จะเป็น False, False, True และ False ตามลำดับเพราะสำหรับผู้ใช้ 0 ในตอนแรกไม่มีคำขอดังนั้นจึงเป็นเท็จ ดังนั้น ณ เวลา 16 จะไม่มากกว่าเวลาหมดอายุ 6 กว่าคำขอล่าสุด 10 แต่เมื่ออายุ 17 ปี จะเป็นจริง และสำหรับคำขอสุดท้าย จะเป็นสำหรับผู้ใช้ 1 ดังนั้นคำขอเริ่มต้นจึงเป็นเท็จ

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

กำหนดคอนสตรัคเตอร์ การดำเนินการนี้จะหมดอายุ

  • lastCall :=สร้างพจนานุกรมโดยค่าเริ่มต้นคือ -1
  • กำหนดฟังก์ชัน limit() การดำเนินการนี้จะใช้เวลา uid การประทับเวลา
  • last :=lastCall[uid]
  • ถ้าสุดท้ายเหมือนกับ -1 หรือ (สุดท้าย + หมดอายุ) <=เวลาประทับ แล้ว
    • lastCall[uid] :=เวลาประทับ
    • คืนค่าเท็จ
  • คืนค่า 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