0Pricing
Lua Academy · บทเรียน

การจำกัดอัตราด้วย Lua

สร้างตัวจำกัดอัตราแบบหน้าต่างเลื่อนใน Redis Lua อย่างอะตอมิก

การจำกัดอัตราด้วย Lua เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงใช้ Redis สำหรับการจำกัดอัตรา

Redis มีการดำเนินการแบบอะตอมิก ความเร็วจากการทำงานในหน่วยความจำ และสถานะร่วมกันระหว่างเซิร์ฟเวอร์แอปพลิเคชันหลายเครื่อง จึงเหมาะอย่างยิ่งสำหรับการจำกัดอัตราแบบกระจาย

ตัวนับหน้าต่างเวลาแบบคงที่อย่างง่าย

นับจำนวนคำขอต่อช่วงเวลาโดยใช้ INCR และ EXPIRE

EVAL "
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local count = redis.call('INCR', key)
if count == 1 then
  redis.call('EXPIRE', key, window)
end
if count > limit then
  return 0  -- rejected
end
return 1  -- allowed
" 1 rate:user:123 100 60

หน้าต่างเวลาเลื่อนด้วยเซตเรียงลำดับ

ตัวจำกัดอัตราที่แม่นยำยิ่งขึ้นใช้เซตเรียงลำดับที่จัดทำดัชนีด้วยการประทับเวลา ลบรายการเก่า เพิ่มคำขอปัจจุบัน และนับขนาดของเซต

EVAL "
local key = KEYS[1]
local now = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local limit = tonumber(ARGV[3])
redis.call('ZREMRANGEBYSCORE', key, 0, now - window * 1000)
redis.call('ZADD', key, now, now .. math.random())
redis.call('EXPIRE', key, window)
local count = redis.call('ZCARD', key)
if count > limit then return 0 end
return 1
" 1 slidingRate:user:123 1706000000000 60 100

อัลกอริทึมถังโทเค็น

ถังโทเค็นอนุญาตให้มีคำขอพุ่งขึ้นเป็นช่วง ๆ พร้อมรักษาอัตราเฉลี่ย เติมโทเค็นตามเวลา และให้แต่ละคำขอใช้โทเค็นหนึ่งรายการ

อัลกอริทึมถังรั่ว

ถังรั่วบังคับใช้อัตราคงที่อย่างเข้มงวด คำขอจะถูกจัดคิวไว้ในถังและประมวลผลด้วยอัตราการระบายคงที่ คำขอที่ล้นความจุจะถูกปฏิเสธ

ขีดจำกัดต่อผู้ใช้และต่อ IP

กำหนดคีย์ของตัวจำกัดอัตราตามรหัสผู้ใช้ คีย์ API หรือที่อยู่ IP: rate:{userId}, rate:{ip}, rate:{apiKey}

ขีดจำกัดอัตราแบบแบ่งระดับ

ใช้ขีดจำกัดที่แตกต่างกันตามระดับผู้ใช้ (ฟรีเทียบกับมืออาชีพ) ตรวจสอบระดับของผู้ใช้ก่อนเลือกว่าจะบังคับใช้ขีดจำกัดใด

EVAL "
local tier = redis.call('HGET', 'user:tier', ARGV[1])
local limit = tier == 'pro' and 10000 or 1000
-- ... rest of rate limit check
" 0 "userId123"

การส่งคืนส่วนหัว

ส่งคืนจำนวนคำขอที่เหลือและเวลารีเซ็ตจากสคริปต์ เพื่อให้แอปพลิเคชันกำหนดส่วนหัว X-RateLimit ในการตอบกลับ HTTP ได้

return {allowed, limit - count, resetTime}

การรับประกันความเป็นอะตอมิกแบบกระจาย

เนื่องจากการตรวจสอบขีดจำกัดอัตราทั้งหมดอยู่ในสคริปต์ EVAL เดียว จึงเป็นอะตอมิกในอินสแตนซ์เซิร์ฟเวอร์แอปพลิเคชันทั้งหมดที่ใช้คลัสเตอร์ Redis ร่วมกัน

หมายเหตุเกี่ยวกับ Redis Cluster

ในโหมด Redis Cluster KEYS ทั้งหมดที่ใช้ในสคริปต์ต้องแฮชไปยังสล็อตเดียวกัน ใช้แท็กแฮช: rate:{user123}:requests เพื่อบังคับให้จัดวางอยู่ร่วมกัน

การตรวจติดตามขีดจำกัดอัตรา

บันทึกคำขอที่ถูกปฏิเสธพร้อมข้อมูลผู้ใช้/IP ตั้งค่าการแจ้งเตือนเมื่ออัตราการปฏิเสธพุ่งสูงขึ้น (ซึ่งบ่งชี้ถึงการโจมตีหรือการกำหนดค่าผิดพลาด)

คำถามเกี่ยวกับการจำกัดอัตรา

เหตุใดสคริปต์ Redis Lua จึงดีกว่าตัวนับที่อยู่ฝั่งแอปพลิเคชันสำหรับการจำกัดอัตรา

บทสรุป: การจำกัดอัตราด้วย Lua

สร้างตัวจำกัดอัตราใน Redis Lua โดยใช้ INCR+EXPIRE (หน้าต่างเวลาคงที่) หรือเซตเรียงลำดับ (หน้าต่างเวลาเลื่อน) สคริปต์แบบอะตอมิกรับประกันความถูกต้องระหว่างเซิร์ฟเวอร์แอปพลิเคชันแบบกระจาย ส่งคืนโควตาที่เหลือสำหรับส่วนหัว HTTP

คำถามที่พบบ่อย

บทเรียน “การจำกัดอัตราด้วย Lua” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจำกัดอัตราด้วย Lua” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจำกัดอัตราด้วย Lua”

สร้างตัวจำกัดอัตราแบบหน้าต่างเลื่อนใน Redis Lua อย่างอะตอมิก คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การจำกัดอัตราด้วย Lua” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. EVAL และสภาพแวดล้อม Lua ของ Redis
  2. การดำเนินการแบบอะตอมิกและธุรกรรม
  3. การจำกัดอัตราด้วย Lua
  4. SCRIPT LOAD และ EVALSHA
← กลับไปที่ Lua Academy