การดำเนินการแบบอะตอมิกและธุรกรรม
ใช้สคริปต์ Lua เพื่อดำเนินการ Redis หลายขั้นตอนแบบอะตอมิก
การดำเนินการแบบอะตอมิกและธุรกรรม เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดการดำเนินการหลายขั้นตอนแบบอะตอมิกจึงสำคัญ
กรณีการใช้งาน Redis หลายรูปแบบจำเป็นต้องอ่านและเขียนหลายคีย์ภายในการดำเนินการเดียวที่มีความสอดคล้อง หากไม่มีความเป็นอะตอมิก สภาวะแข่งขันอาจทำให้สถานะเสียหาย
สภาวะแข่งขันในการอ่าน-แก้ไข-เขียน
หากไม่ใช้ Lua: GET counter → แก้ไขในไคลเอ็นต์ → SET counter ไคลเอ็นต์สองตัวอาจอ่านค่าเดียวกัน แก้ไขค่าพร้อมกัน และการ SET ครั้งที่สองจะเขียนทับการเปลี่ยนแปลงของครั้งแรก
การแก้ไขด้วยสคริปต์ Lua
เมื่อใช้ Lua ใน Redis การอ่าน-แก้ไข-เขียนจะเกิดขึ้นแบบอะตอมิกภายในเซิร์ฟเวอร์
EVAL "
local val = redis.call('GET', KEYS[1])
val = tonumber(val) or 0
val = val + tonumber(ARGV[1])
redis.call('SET', KEYS[1], val)
return val
" 1 counter 5การเปรียบเทียบและสลับค่า
ทำ CAS (การเปรียบเทียบและสลับค่า) แบบอะตอมิก โดยอัปเดตเฉพาะเมื่อค่าปัจจุบันเท่ากับค่าที่คาดไว้
EVAL "
local cur = redis.call('GET', KEYS[1])
if cur == ARGV[1] then
redis.call('SET', KEYS[1], ARGV[2])
return 1
end
return 0
" 1 mykey expected newvalueการล็อกแบบกระจาย
รับล็อกแบบอะตอมิก: SET key value NX EX seconds นี่คือรูปแบบที่ปลอดภัย ซึ่งเทียบเท่ากับการทำงานด้วย Lua
EVAL "
if redis.call('SET', KEYS[1], ARGV[1], 'NX', 'EX', ARGV[2]) then
return 1
end
return 0
" 1 lock:resource "owner-uuid" 30การปล่อยล็อกอย่างปลอดภัย
ปล่อยล็อกเฉพาะเมื่อคุณเป็นเจ้าของเท่านั้น วิธีนี้ป้องกันไม่ให้ไคลเอ็นต์อื่นปล่อยล็อกของผู้อื่น
EVAL "
if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('DEL', KEYS[1])
end
return 0
" 1 lock:resource "owner-uuid"ธุรกรรมหลายคีย์
สคริปต์ Lua สามารถดำเนินการกับหลายคีย์แบบอะตอมิกได้ ซึ่งเป็นสิ่งที่ MULTI/EXEC รับประกันไม่ได้ (อาจล้มเหลวระหว่างทางและทิ้งสถานะบางส่วนไว้)
MULTI/EXEC เทียบกับ Lua
MULTI/EXEC จัดคิวคำสั่งเพื่อดำเนินการเป็นชุด แต่ไม่เป็นอะตอมิกอย่างแท้จริงในส่วนของค่าที่อ่าน (watch/unwatch เพิ่มความซับซ้อน) สคริปต์ Lua เรียบง่ายกว่าและเป็นอะตอมิกอย่างสมบูรณ์
การย้อนกลับใน Lua
Redis Lua ไม่รองรับธุรกรรมที่ย้อนกลับได้ หากเกิดข้อผิดพลาดระหว่างทาง คำสั่ง redis.call ที่ดำเนินการไปแล้วจะไม่ถูกย้อนกลับ ออกแบบสคริปต์ให้ปลอดภัยด้วยการตรวจสอบเงื่อนไขเบื้องต้นก่อน
ข้อจำกัดด้านขนาดสคริปต์
สคริปต์ควรมีขนาดเล็กและทำงานรวดเร็ว ตรรกะที่ซับซ้อนควรอยู่ในชั้นแอปพลิเคชัน ไม่ใช่ใน Redis ใช้ Lua เฉพาะส่วนที่ต้องการความเป็นอะตอมิก
การทดสอบความเป็นอะตอมิก
ทดสอบสภาวะแข่งขันด้วยไคลเอ็นต์ Redis ที่ทำงานพร้อมกันหลายตัว ตรวจสอบว่าสคริปต์ Lua รักษาสถานะที่ถูกต้องภายใต้การทำงานพร้อมกันในระดับสูง โดยใช้เครื่องมือทดสอบประสิทธิภาพของ Redis
คำถามเกี่ยวกับการดำเนินการแบบอะตอมิก
เหตุใดการอ่าน-แก้ไข-เขียนในสคริปต์ Redis Lua จึงปลอดภัยกว่าการทำเช่นเดียวกันในโค้ดแอปพลิเคชัน
บทสรุป: การดำเนินการแบบอะตอมิกและธุรกรรม
ใช้สคริปต์ Redis Lua สำหรับการอ่าน-แก้ไข-เขียนแบบอะตอมิก, CAS และการล็อกแบบกระจาย สคริปต์ Lua เรียบง่ายและถูกต้องกว่า MULTI/EXEC สำหรับการดำเนินการที่ขึ้นอยู่กับค่าที่อ่าน ควรรักษาสคริปต์ให้กระชับและทดสอบภายใต้การทำงานพร้อมกัน
คำถามที่พบบ่อย
บทเรียน “การดำเนินการแบบอะตอมิกและธุรกรรม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การดำเนินการแบบอะตอมิกและธุรกรรม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การดำเนินการแบบอะตอมิกและธุรกรรม”
ใช้สคริปต์ Lua เพื่อดำเนินการ Redis หลายขั้นตอนแบบอะตอมิก คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การดำเนินการแบบอะตอมิกและธุรกรรม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- EVAL และสภาพแวดล้อม Lua ของ Redis
- การดำเนินการแบบอะตอมิกและธุรกรรม
- การจำกัดอัตราด้วย Lua
- SCRIPT LOAD และ EVALSHA