การจำกัดอัตราด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- EVAL และสภาพแวดล้อม Lua ของ Redis
- การดำเนินการแบบอะตอมิกและธุรกรรม
- การจำกัดอัตราด้วย Lua
- SCRIPT LOAD และ EVALSHA