ข้ามไปยังเนื้อหา

Redis คืออะไร?

Redis เก็บทุก key และค่าที่เชื่อมโยงโดยตรงใน RAM เมื่อแอปพลิเคชันของคุณ set key ข้อมูลจะอยู่ในหน่วยความจำ — ไม่มีการค้นหาดิสก์ ไม่มี page fault ไม่มี overhead ของ file system เมื่ออ่าน key กลับมา คำตอบก็มาจากหน่วยความจำเดิมนั้น นี่คือเหตุผลที่ความหน่วงของ Redis อยู่ต่ำกว่ามิลลิวินาทีอย่างสม่ำเสมอแม้ภายใต้โหลดหนัก

แต่ละค่ามี type Redis ไม่ใช่แค่ที่เก็บ string ธรรมดา — แต่เข้าใจโครงสร้างข้อมูลได้โดยตรง: Strings, Lists, Hashes, Sets, Sorted Sets, Streams และอีกมาก เซิร์ฟเวอร์สามารถทำงานกับโครงสร้างเหล่านั้นแบบ atomic ได้โดยตรง นั่นหมายความว่าคุณสามารถ append ลงใน list, เพิ่มค่า counter, หรือ pop จาก queue ได้โดยไม่ต้องล็อคระดับ application

Redis ประมวลผลคำสั่งผ่าน single-threaded event loop thread เดียวอ่านคำสั่งจาก network socket, รันให้เสร็จสมบูรณ์, เขียน reply แล้วจึงไปยังคำสั่งถัดไป ไม่มี parallelism ภายใน Redis instance เดียว

การออกแบบนี้มีผลสำคัญสองประการ:

  • ความเร็ว — ไม่มี context switching, ไม่มี mutex contention, ไม่มี lock overhead event loop ดึงประสิทธิภาพสูงสุดออกจาก core เดียว
  • Thread safety โดยการออกแบบ — เนื่องจากมีคำสั่งเดียวทำงานในแต่ละครั้ง ทุกคำสั่งจึง atomic โดยปริยาย คุณไม่ต้องกังวลว่า client สองตัวจะทำให้ shared state เสียหายระหว่างการทำงาน

ประโยคที่ว่า “Redis คือ cache” เป็นเรื่องทั่วไปแต่ไม่ครบถ้วน cache ธรรมดา map key ไปยัง blob ที่ไม่รู้โครงสร้าง Redis map key ไปยัง โครงสร้างข้อมูลที่หลากหลาย ที่คุณสามารถจัดการได้ฝั่งเซิร์ฟเวอร์:

ประเภทคำอธิบาย
Stringข้อความ, ตัวเลข, หรือ raw bytes ได้ถึง 512 MB
Listลำดับที่เรียงไว้; push/pop จากทั้งสองด้าน
Hashfield-value map ภายใน key เดียว
Setคอลเลกชันของ member ที่ไม่ซ้ำกันแบบไม่มีลำดับ
Sorted SetSet ที่แต่ละ member มี numeric score
Streamบันทึกแบบ append-only ของ entry ที่มี timestamp

เนื่องจาก operation เกิดขึ้นฝั่งเซิร์ฟเวอร์ คุณจึงหลีกเลี่ยง round trip แทนที่จะ GET → แก้ไข locally → SET คุณใช้ LPUSH หรือ ZINCRBY ใน network call เดียว

Use caseRedis feature
Cache (แคช)TTL-based expiry บน key ใดก็ได้
Session store (เก็บ session)Hash ต่อ session ID, อ่านได้เร็ว
Task queue (คิวงาน)LPUSH / BRPOP บน List
Leaderboard (ตารางคะแนน)Sorted Set กับ ZADD / ZRANK
Rate limiter (จำกัดอัตราคำขอ)INCR + EXPIRE บน counter key
Pub/Sub messaging (ส่งข้อความ)PUBLISH / SUBSCRIBE channels

รัน PING เพื่อยืนยันว่าเซิร์ฟเวอร์ทำงานอยู่ แล้วใช้ TYPE เพื่อตรวจสอบ key ใดก็ได้:

127.0.0.1:6379> PING
PONG
127.0.0.1:6379> SET language "Redis"
OK
127.0.0.1:6379> TYPE language
string
PING
ตัวเลือกBenefitCost
เก็บข้อมูลใน RAM (in-memory)latency ต่ำกว่ามิลลิวินาที อ่าน/เขียนเร็วกว่าดิสก์มากต้นทุน RAM แพงกว่า disk มาก และข้อมูลทั้งหมดต้องพอดีกับหน่วยความจำที่มี
Single-threaded event loopไม่มี lock contention ทุกคำสั่ง atomic โดยธรรมชาติ debug ง่ายใช้ CPU ได้แค่ core เดียวต่อ instance ไม่มี parallelism ภายใน
  • คิดว่า Redis คือฐานข้อมูลถาวรโดยอัตโนมัติ — ค่าเริ่มต้นเน้นความเร็ว ไม่ใช่ durability หากต้องการกันข้อมูลหาย ต้องตั้งค่า persistence (RDB/AOF) เอง
  • ปล่อยให้ dataset โตโดยไม่ตั้ง maxmemory — เพราะทุกอย่างอยู่ใน RAM ถ้าไม่จำกัดขนาดหรือกำหนด eviction policy ไว้ก่อน Redis อาจใช้หน่วยความจำจนเครื่อง OOM
  • เข้าใจผิดว่า single-threaded แปลว่า “ช้า” — จริง ๆ แล้ว event loop เดี่ยวคือสิ่งที่ทำให้ Redis เร็วเพราะไม่มี context switching แต่ก็หมายความว่าคำสั่งที่หนัก (เช่น KEYS * บน dataset ใหญ่) จะบล็อก client อื่นทั้งหมดจนกว่าจะเสร็จ

💡 ตัวอย่างจากของจริง

Twitter — ใช้ Redis เป็น timeline cache เพื่อเสิร์ฟ tweet ล่าสุดของผู้ใช้แต่ละคนแบบ real-time โดยไม่ต้อง query ฐานข้อมูลหลักซ้ำทุกครั้ง

Stack Overflow — วาง Redis ไว้เป็น cache layer หน้า SQL Server เพื่อลดโหลดการ query และลด latency ของหน้าเว็บที่มีคนอ่านพร้อมกันจำนวนมาก

ทำไม Redis จึงเร็วกว่าฐานข้อมูลที่ใช้ดิสก์?
Single-threaded event loop ทำให้ Redis thread-safe ได้อย่างไร?
ประเภทข้อมูล Redis ใดที่คุณจะใช้เพื่อสร้าง leaderboard ที่มีการจัดอันดับ?
คำสั่งใดที่ใช้ตรวจสอบประเภทข้อมูลของ Redis key ที่มีอยู่?