2025/10/19-redis-บันทึกแนวทางการใช้งาน-set-และ-sorted-set preview

Redis บันทึกการใช้งาน Set และ Sorted Set (ZSET)

ทำไมต้อง Set และ Sorted Set?

พองานเริ่มต้องการข้อมูลที่ห้ามซ้ำ หรืออยากจัดอันดับตามคะแนนแบบดึงไปใช้ได้ทันที List กับ Hash ของ Redis มักเริ่มไม่พอ จุดนี้แหละที่ Set และ Sorted Set (ZSET) เข้ามาช่วย

บทความนี้จะพาไล่ทีละส่วนว่า 2 โครงสร้างนี้ต่างกันยังไง เหมาะกับปัญหาแบบไหน และควรหยิบไปใช้เมื่อไร

Redis Set (SADD, SMEMBERS, SISMEMBER)

Redis Set คือกลุ่มของข้อมูลสตริงที่ไม่ซ้ำกัน และไม่ได้เก็บลำดับสมาชิกไว้ คล้าย Set ในคณิตศาสตร์

คุณสมบัติหลัก:

  1. ไม่ซ้ำกันโดยธรรมชาติ (Uniqueness): ถ้าเพิ่มสมาชิกเดิมซ้ำ Redis จะไม่เก็บซ้ำ
  2. ทำงานเชิงเซตได้เร็ว: ทั้ง 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) เข้ามา ทำให้ข้อมูลไม่ซ้ำและเรียงลำดับได้พร้อมกัน

คุณสมบัติหลัก

  1. สมาชิกไม่ซ้ำ + มีคะแนนกำกับ: สมาชิกแต่ละตัวต้องไม่ซ้ำ และมีค่า score แบบตัวเลข (floating point)
  2. เรียงให้อัตโนมัติ: 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 ได้เลย

← Biome ยุติสงครามระหว่าง ESLint และ Prettier