Redis บันทึกการใช้งาน Set และ Sorted Set (ZSET)
ทำไมต้อง Set และ Sorted Set?
พองานเริ่มต้องการข้อมูลที่ห้ามซ้ำ หรืออยากจัดอันดับตามคะแนนแบบดึงไปใช้ได้ทันที List กับ Hash ของ Redis มักเริ่มไม่พอ จุดนี้แหละที่ Set และ Sorted Set (ZSET) เข้ามาช่วย
บทความนี้จะพาไล่ทีละส่วนว่า 2 โครงสร้างนี้ต่างกันยังไง เหมาะกับปัญหาแบบไหน และควรหยิบไปใช้เมื่อไร
Redis Set (SADD, SMEMBERS, SISMEMBER)
Redis Set คือกลุ่มของข้อมูลสตริงที่ไม่ซ้ำกัน และไม่ได้เก็บลำดับสมาชิกไว้ คล้าย Set ในคณิตศาสตร์
คุณสมบัติหลัก:
- ไม่ซ้ำกันโดยธรรมชาติ (Uniqueness): ถ้าเพิ่มสมาชิกเดิมซ้ำ Redis จะไม่เก็บซ้ำ
- ทำงานเชิงเซตได้เร็ว: ทั้ง Union (รวม), Intersection (หาจุดร่วม), และ Difference (หาส่วนต่าง) ทำได้ตรง ๆ และมีประสิทธิภาพสูง (โดยทั่วไป O(N) ตามจำนวนสมาชิกของชุดที่เล็กกว่า)
ตัวอย่างการใช้งาน Set
การจัดการสิทธิ์ผู้ใช้ (User Permissions)
| คำสั่ง | คำอธิบาย |
|---|---|
SADD admins user:anuwong user:jane | เพิ่มผู้ใช้ anuwong และ jane เข้าในกลุ่ม admins |
SADD editors user:jane user:peter | เพิ่ม jane และ peter เข้าในกลุ่ม editors |
SISMEMBER admins user:anuwong | ตรวจสอบว่า anuwong เป็น Admin หรือไม่ (ผลลัพธ์: 1/True) |
SINTER admins editors | หาผู้ใช้ที่เป็นทั้ง Admin และ Editor (ผลลัพธ์: user:jane) |
เคสนี้เห็นภาพชัดว่า Set เหมาะกับข้อมูลประเภท “มี/ไม่มี” เช่น เป็นสมาชิกกลุ่มนี้ไหม มีสิทธิ์นี้หรือเปล่า เพราะไม่ต้องกังวลเรื่องข้อมูลซ้ำตั้งแต่แรก
Redis Sorted Set (ZADD, ZRANGE, ZRANK)
Redis Sorted Set (ZSET) คือ Set ที่เพิ่มมิติของคะแนน (score) เข้ามา ทำให้ข้อมูลไม่ซ้ำและเรียงลำดับได้พร้อมกัน
คุณสมบัติหลัก
- สมาชิกไม่ซ้ำ + มีคะแนนกำกับ: สมาชิกแต่ละตัวต้องไม่ซ้ำ และมีค่า score แบบตัวเลข (floating point)
- เรียงให้อัตโนมัติ: Redis จะเรียงตาม score จากน้อยไปมากให้เลย
ตัวอย่างการใช้งาน Sorted Set
Leaderboard หรือ Ranking System
| คำสั่ง | คำอธิบาย |
|---|---|
| ZADD leaderboard 1500 user:anuwong | เพิ่ม anuwong ด้วยคะแนน 1500 |
| ZADD leaderboard 2200 user:peter | เพิ่ม peter ด้วยคะแนน 2200 |
| ZRANGE leaderboard 0 9 WITHSCORES | ดึง 10 อันดับแรกของ Leaderboard (เรียงจากน้อยไปมาก) |
| ZREVRANGE leaderboard 0 9 WITHSCORES | ดึง 10 อันดับสูงสุด (เรียงจากมากไปน้อย) |
| ZRANK leaderboard user:peter | ค้นหาอันดับ (Index) ของ peter จากลำดับที่น้อยที่สุด |
ถ้าต้องทำอันดับเกม คะแนนสะสม หรือระบบจัดลำดับที่ต้องอัปเดตบ่อย ๆ ZSET จะตอบโจทย์มาก เพราะทั้งเพิ่มคะแนนและดึงอันดับทำได้ในโครงสร้างเดียว
สรุปสั้น ๆ คือ ถ้าโจทย์คือ “เก็บสมาชิกไม่ให้ซ้ำ” ให้เริ่มที่ Set แต่ถ้าโจทย์คือ “เก็บแบบไม่ซ้ำและต้องจัดอันดับ” ให้ไป ZSET ได้เลย
