พจนานุกรมหน่วยความจำใช้ร่วมกัน
แคชข้อมูลข้ามเวิร์กเกอร์ด้วย ngx.shared.DICT เพื่อการค้นหาที่หน่วงต่ำ
พจนานุกรมหน่วยความจำใช้ร่วมกัน เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
ngx.shared.DICT คืออะไร
ngx.shared.DICT คือโซนหน่วยความจำที่ใช้ร่วมกัน ซึ่งกระบวนการทำงานของ Nginx ทั้งหมดเข้าถึงได้ โดยมีการดำเนินการ get/set/incr แบบ O(1) สำหรับการแคชและการประสานงาน
การประกาศหน่วยความจำที่ใช้ร่วมกันใน nginx.conf
จัดสรรพจนานุกรมที่ใช้หน่วยความจำร่วมกันด้วยชื่อและขนาดภายในบล็อก http
# nginx.conf
http {
lua_shared_dict rate_limit 10m;
lua_shared_dict cache 50m;
lua_shared_dict locks 1m;
}การรับและกำหนดค่าพื้นฐาน
จัดเก็บและดึงค่าด้วย TTL ที่เป็นตัวเลือกได้ ซึ่งหมายถึงอายุการใช้งานเป็นวินาที
-- content_by_lua_block
local cache = ngx.shared.cache
cache:set("greeting", "Hello, World!", 60) -- expires in 60s
local val = cache:get("greeting")
ngx.say(val) -- Hello, World!การเพิ่มค่าแบบอะตอมิก
dict:incr(key, delta, init, expiry) เพิ่มค่าตัวนับแบบอะตอมิก โดยกำหนดค่าเริ่มต้นเป็น init หากไม่มีคีย์อยู่
local rl = ngx.shared.rate_limit
local count = rl:incr("req:" .. ngx.var.remote_addr, 1, 0, 60)
if count > 100 then
ngx.exit(429) -- Too Many Requests
endการจำกัดอัตราด้วยหน่วยความจำที่ใช้ร่วมกัน
รูปแบบ incr ใช้งานตัวจำกัดอัตราแบบหน้าต่างเลื่อนอย่างง่าย ซึ่งเป็นรูปแบบ OpenResty ที่พบบ่อยที่สุดรูปแบบหนึ่ง
การลบและการล้างข้อมูล
dict:delete(key) ลบคีย์เดียว ส่วน dict:flush_all() ทำเครื่องหมายให้คีย์ทั้งหมดหมดอายุ โดยลบแบบขี้เกียจ และ dict:flush_expired(n) ลบคีย์ที่หมดอายุแล้วทันที
การเพิ่มค่าแบบอะตอมิก
dict:add(key, val, expiry) กำหนดค่าให้คีย์เฉพาะเมื่อคีย์นั้นยังไม่มีอยู่ ซึ่งมีประโยชน์สำหรับการล็อกแบบกระจาย
local locks = ngx.shared.locks
local ok, err = locks:add("my_lock", true, 5) -- 5s lock
if not ok then
ngx.say("Lock held, try later")
return
end
-- critical section
-- locks:delete("my_lock") -- releaseการวางแผนขนาดหน่วยความจำที่ใช้ร่วมกัน
คู่คีย์-ค่าทุกคู่มีค่าใช้จ่ายส่วนเกินประมาณ 100 ไบต์ ประมาณการได้ดังนี้: size_mb * 1024^2 / avg_entry_size = จำนวนรายการสูงสุด ตรวจสอบด้วย dict:capacity() และ dict:free_space()
การนำข้อมูลออกจากหน่วยความจำ
เมื่อพจนานุกรมเต็ม OpenResty จะนำรายการที่เก่าที่สุดออกเพื่อเปิดพื้นที่ กำหนด TTL ที่เหมาะสมเพื่อควบคุมพฤติกรรมการนำข้อมูลออก
การประสานงานระหว่างกระบวนการทำงาน
เนื่องจากกระบวนการทำงานทั้งหมดใช้พจนานุกรมเดียวกันร่วมกัน จึงใช้ :add สำหรับการเลือกผู้นำ และใช้ :incr สำหรับตัวนับส่วนกลางที่ครอบคลุมกระบวนการทำงานทั้งหมด
ข้อจำกัด
พจนานุกรมที่ใช้ร่วมกันรองรับเฉพาะค่าแบบสเกลาร์ ได้แก่ สตริง ตัวเลข และบูลีน หากต้องการจัดเก็บตาราง ให้แปลงเป็น JSON ด้วย cjson
คำถามเกี่ยวกับหน่วยความจำที่ใช้ร่วมกัน
dict:incr(key, 1, 0, 60) ทำอะไร
ทบทวน: พจนานุกรมหน่วยความจำที่ใช้ร่วมกัน
ngx.shared.DICT ให้การดำเนินการ get/set/incr แบบอะตอมิก O(1) ที่ใช้ได้กับกระบวนการทำงานทั้งหมด ใช้สำหรับการจำกัดอัตรา การแคช และการล็อกแบบกระจาย กำหนด TTL เพื่อควบคุมการนำข้อมูลออก และแปลงตารางเป็น JSON สำหรับค่าที่ซับซ้อน
คำถามที่พบบ่อย
บทเรียน “พจนานุกรมหน่วยความจำใช้ร่วมกัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พจนานุกรมหน่วยความจำใช้ร่วมกัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พจนานุกรมหน่วยความจำใช้ร่วมกัน”
แคชข้อมูลข้ามเวิร์กเกอร์ด้วย ngx.shared.DICT เพื่อการค้นหาที่หน่วงต่ำ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “พจนานุกรมหน่วยความจำใช้ร่วมกัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สถาปัตยกรรม OpenResty
- การจัดการคำขอ HTTP ใน Lua
- Cosocket และ TCP แบบไม่บล็อก
- พจนานุกรมหน่วยความจำใช้ร่วมกัน