~/VibeHandbook
PDF ฟรี

ฐานข้อมูล

redis.io

Redis

คืออะไร

ลองนึกภาพการเก็บโน้ตที่คุณต้องใช้ตอนนี้ไว้บนโต๊ะทำงานตรงหน้า แทนที่จะเดินไปหยิบจากตู้เก็บเอกสารทุกครั้ง — เร็วกว่ามาก แต่ถ้าไฟดับ ของบนโต๊ะก็หายไปหมด Redis ทำงานเหมือนโต๊ะนั้น คือมันเก็บข้อมูลไว้ในหน่วยความจำที่เข้าถึงได้เร็ว (RAM หรือ Random Access Memory) แทนที่จะเก็บบนดิสก์ ทำให้การอ่านและเขียนข้อมูลเร็วมาก นอกจากนี้ยังสามารถบันทึกลงดิสก์ได้ด้วยถ้าต้องการ มันทำงานเป็น key-value store (ที่เก็บข้อมูลแบบคู่กุญแจ-ค่า) แต่รองรับโครงสร้างข้อมูลที่หลากหลาย เช่น list, set, sorted set, hash และ stream มักถูกใช้เป็น (ที่พักข้อมูลชั่วคราวเพื่อความเร็ว), store (ที่เก็บข้อมูลการล็อกอิน), (คิวงาน) หรือ rate limiter (ตัวจำกัดอัตราการเรียกใช้) ควบคู่ไปกับฐานข้อมูลหลัก

จุดแข็ง

  • ความหน่วง (latency) ต่ำกว่ามิลลิวินาที เพราะทำงานในหน่วยความจำ
  • โครงสร้างข้อมูลหลากหลาย: strings, hashes, lists, sets, sorted sets, streams
  • มี TTL (Time To Live)/วันหมดอายุในตัว — แต่ละรายการสามารถลบตัวเองอัตโนมัติหลังเวลาที่กำหนด — เหมาะมากสำหรับการทำ caching และ session
  • การทำงานแบบ atomic (ทำครบหรือไม่ทำเลย) และ Lua scripting สำหรับตัวนับและการล็อกที่ปลอดภัย
  • รองรับ pub/sub และ streams สำหรับระบบส่งข้อความและ event pipeline

ข้อแลกเปลี่ยน

  • ข้อมูลถูกจำกัดด้วยหน่วยความจำที่มี ชุดข้อมูลขนาดใหญ่จะมีค่าใช้จ่ายสูง
  • การบันทึกลงดิสก์เป็นทางเลือก และอาจสูญเสียข้อมูลที่เพิ่งเขียนไปหากระบบล่ม
  • ไม่ใช่ตัวทดแทนฐานข้อมูลเชิงสัมพันธ์ (relational store) ที่คงทน
  • การทำ clustering เพิ่มความซับซ้อนในการดูแลระบบสำหรับ sharding และ failover

ควรใช้เมื่อไร

ใช้ Redis เพื่อแคชผลลัพธ์ของคำสั่งค้นหาที่มีต้นทุนสูง เก็บ session จัดการ rate limiting บริหารคิวงาน สร้างกระดานผู้นำ (leaderboard) หรือส่งข้อความแบบเรียลไทม์ ควรใช้คู่กับฐานข้อมูลที่คงทนซึ่งเป็นแหล่งข้อมูลจริง (source of truth)

เข้ากับ vibe coding อย่างไร

เวลาสั่งงาน AI ต้องบอกให้ชัดว่า Redis เป็น cache หรือที่เก็บข้อมูลเสริม ไม่ใช่ระบบบันทึกหลัก ดังนั้นควรตั้ง TTL ให้กับข้อมูลที่แคชไว้เสมอ นอกจากนี้ควรออกแบบรูปแบบการตั้งชื่อ key ให้ชัดเจน (ตัวอย่างเช่น user:123:profile) ให้ AI ใช้คำสั่งแบบ atomic เช่น INCR สำหรับตัวนับ และ SET ... NX EX สำหรับการล็อก แทนที่จะใช้ลำดับ read-modify-write (อ่าน-แก้ไข-เขียน) ที่อาจเกิดการแข่งกันเข้าถึงข้อมูล (race condition) เคล็ดลับที่ดี: ให้ AI ใช้รูปแบบ cache-aside ซึ่งหมายความง่าย ๆ ว่า ให้ดูใน cache ก่อน ถ้าไม่มีค่อยไปดึงจากฐานข้อมูล แล้วบันทึกลง cache ไว้ใช้ครั้งต่อไป และควรให้ AI อธิบายกลยุทธ์การล้างข้อมูลเก่า (invalidation) ด้วย — คือวิธีที่ข้อมูลเก่าที่ไม่ทันสมัยแล้วจะถูกลบออก — เพื่อไม่ให้ข้อมูลที่ล้าสมัยค้างอยู่

# Cache a value with a 1-hour expiry
SET user:123:profile "{\"name\":\"Ada\"}" EX 3600

# Atomic rate-limit counter
INCR rate:ip:203.0.113.5
EXPIRE rate:ip:203.0.113.5 60

# Distributed lock: set only if not exists, auto-expire
SET lock:job:42 "owner-a" NX EX 30

# Leaderboard with a sorted set
ZADD leaderboard 4200 "player:7"
ZREVRANGE leaderboard 0 9 WITHSCORES