Redis คืออะไร?
In-memory key-value data store
หัวข้อที่มีชื่อว่า “In-memory key-value data store”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
Single-threaded event loop
หัวข้อที่มีชื่อว่า “Single-threaded event loop”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 เสียหายระหว่างการทำงาน
Data-structure server ไม่ใช่แค่ cache
หัวข้อที่มีชื่อว่า “Data-structure server ไม่ใช่แค่ cache”ประโยคที่ว่า “Redis คือ cache” เป็นเรื่องทั่วไปแต่ไม่ครบถ้วน cache ธรรมดา map key ไปยัง blob ที่ไม่รู้โครงสร้าง Redis map key ไปยัง โครงสร้างข้อมูลที่หลากหลาย ที่คุณสามารถจัดการได้ฝั่งเซิร์ฟเวอร์:
| ประเภท | คำอธิบาย |
|---|---|
| String | ข้อความ, ตัวเลข, หรือ raw bytes ได้ถึง 512 MB |
| List | ลำดับที่เรียงไว้; push/pop จากทั้งสองด้าน |
| Hash | field-value map ภายใน key เดียว |
| Set | คอลเลกชันของ member ที่ไม่ซ้ำกันแบบไม่มีลำดับ |
| Sorted Set | Set ที่แต่ละ member มี numeric score |
| Stream | บันทึกแบบ append-only ของ entry ที่มี timestamp |
เนื่องจาก operation เกิดขึ้นฝั่งเซิร์ฟเวอร์ คุณจึงหลีกเลี่ยง round trip แทนที่จะ GET → แก้ไข locally → SET คุณใช้ LPUSH หรือ ZINCRBY ใน network call เดียว
Use case ทั่วไป
หัวข้อที่มีชื่อว่า “Use case ทั่วไป”| Use case | Redis 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 |
ตรวจสอบ type เบื้องต้น
หัวข้อที่มีชื่อว่า “ตรวจสอบ type เบื้องต้น”รัน PING เพื่อยืนยันว่าเซิร์ฟเวอร์ทำงานอยู่ แล้วใช้ TYPE เพื่อตรวจสอบ key ใดก็ได้:
127.0.0.1:6379> PINGPONG127.0.0.1:6379> SET language "Redis"OK127.0.0.1:6379> TYPE languagestringPINGข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| เก็บข้อมูลใน 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 ของหน้าเว็บที่มีคนอ่านพร้อมกันจำนวนมาก