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

คำสั่งแรกของคุณ

Redis ทำงานบนโมเดล key-value ที่เรียบง่าย — คุณเก็บข้อมูลโดยการผูก value เข้ากับ key จากนั้นดึงข้อมูลกลับมาด้วย key เดิมนั้น ไม่มี schema ไม่มีตาราง เพียงแค่ key และ value เท่านั้น

คำสั่งพื้นฐานที่สุดใน Redis คือ SET และ GET ลองดูตัวอย่างด้านล่างเพื่อทำความเข้าใจว่าคำสั่งเหล่านี้ทำงานร่วมกับ EXISTS, TYPE, KEYS และ DEL อย่างไร

127.0.0.1:6379> SET name "Redis"
OK
127.0.0.1:6379> GET name
"Redis"
127.0.0.1:6379> SET score 100
OK
127.0.0.1:6379> EXISTS name
(integer) 1
127.0.0.1:6379> EXISTS missing
(integer) 0
127.0.0.1:6379> TYPE name
string
127.0.0.1:6379> KEYS *
1) "score"
2) "name"
127.0.0.1:6379> DEL name
(integer) 1
127.0.0.1:6379> GET name
(nil)
SET name "Redis"
GET name
SET score 100
EXISTS name
EXISTS missing
TYPE name
KEYS *
DEL name
GET name
ตัวเลือกBenefitCost
โมเดล key-value แบบไม่มี schemaเริ่มต้นง่าย เก็บอะไรก็ได้ทันทีโดยไม่ต้อง define ตารางล่วงหน้าไม่มีการบังคับ schema หรือ type validation ฝั่ง server ผิดพลาดจาก key/value ที่ไม่ตรง type จะรู้ตอน runtime
ใช้ KEYS * เพื่อดูข้อมูลทั้งหมดสะดวกเวลาทดลองบน dataset เล็ก ๆ ใน devบล็อก event loop จนกว่าจะสแกนครบทุก key ห้ามใช้กับ dataset ใหญ่ใน production
เก็บ key แบบไม่ตั้ง TTLข้อมูลไม่หายไปเอง เหมาะกับข้อมูลที่ต้องอยู่ถาวรถ้าลืมตั้ง expiry สำหรับข้อมูลที่ควรเป็น cache หน่วยความจำจะโตเรื่อย ๆ โดยไม่มีการล้าง
  • ใช้ KEYS * ใน production เพื่อดู key ทั้งหมด — คำสั่งนี้บล็อก server จนกว่าจะสแกนเสร็จ บน dataset ใหญ่อาจทำให้ client อื่นค้าง ควรใช้ SCAN แทนเมื่อทำงานกับข้อมูลจริง
  • ไม่ตั้ง TTL ให้ key ที่ควรเป็นข้อมูลชั่วคราว — ถ้าใช้ SET เก็บ cache โดยไม่ผูก expiry ไว้เลย หน่วยความจำจะสะสมไปเรื่อย ๆ จนถึงขีดจำกัดของ maxmemory
  • ทดสอบคำสั่งผ่าน redis-cli แล้วคิดว่าพฤติกรรมจะเหมือนกันทุกอย่างในโค้ดแอปจริง — client library อาจมี serialization, encoding, หรือ error handling ต่างจากที่เห็นใน CLI ควรทดสอบผ่าน library จริงก่อนขึ้น production ด้วย

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

Twitter — ใช้โครงสร้าง key-value แบบเดียวกับที่เรียนในบทนี้เป็นพื้นฐานของ timeline cache โดยผูก key อย่าง user:<id>:timeline เข้ากับข้อมูล tweet ล่าสุด

Stack Overflow — ใช้ SET/GET ง่าย ๆ แบบนี้เป็นส่วนหนึ่งของ cache layer หน้า SQL Server เพื่อลด query ซ้ำสำหรับหน้าเว็บที่มีคนอ่านพร้อมกันเยอะ

`DEL` คืนค่าอะไรกลับมา?
`EXISTS` คืนค่าอะไรเมื่อ key ไม่มีอยู่จริง?
`TYPE` คืนค่าอะไรสำหรับ key ที่เก็บค่า string ธรรมดา?
ทำไมควรหลีกเลี่ยง `KEYS *` ใน production?