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

พจนานุกรมหน่วยความจำใช้ร่วมกัน

แคชข้อมูลข้ามเวิร์กเกอร์ด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. สถาปัตยกรรม OpenResty
  2. การจัดการคำขอ HTTP ใน Lua
  3. Cosocket และ TCP แบบไม่บล็อก
  4. พจนานุกรมหน่วยความจำใช้ร่วมกัน
← กลับไปที่ Lua Academy