Hashes
Hashes — dictionary แบบ flat ภายใต้ key เดียว
หัวข้อที่มีชื่อว่า “Hashes — dictionary แบบ flat ภายใต้ key เดียว”Redis Hashes เก็บคู่ field-value หลายรายการไว้ภายใต้ key เดียว ลองนึกภาพเป็น dictionary แบบ flat หรือแถวข้อมูลในฐานข้อมูล — หนึ่ง key เก็บได้หลาย field ที่มีชื่อแยกกัน
HSET และ HGET
หัวข้อที่มีชื่อว่า “HSET และ HGET”HSET key field value [field value ...] ตั้งค่าหนึ่ง field หรือหลาย field พร้อมกัน Redis 7+ รองรับการระบุคู่ field-value หลายชุดในคำสั่งเดียว HGET key field ดึงค่าของ field หนึ่งตามชื่อ หาก field ไม่มีอยู่ Redis จะคืนค่า (nil)
127.0.0.1:6379> HSET product:1 name "Redis Mug" price "12.99" stock "200"(integer) 3127.0.0.1:6379> HGET product:1 name"Redis Mug"127.0.0.1:6379> HGET product:1 price"12.99"127.0.0.1:6379> HGET product:1 missing-field(nil)HSET product:1 name "Redis Mug" price "12.99" stock "200"
HGET product:1 name
HGET product:1 price
HGET product:1 missing-fieldHMGET และ HGETALL
หัวข้อที่มีชื่อว่า “HMGET และ HGETALL”HMGET key field [field ...] ดึงหลาย field ในครั้งเดียว และคืนค่า (nil) สำหรับ field ที่ไม่มีอยู่ HGETALL key คืนค่าคู่ field-value ทั้งหมดในรูปแบบรายการสลับกันระหว่างชื่อ field และค่า
127.0.0.1:6379> HMGET product:1 name stock1) "Redis Mug"2) "200"127.0.0.1:6379> HGETALL product:11) "name"2) "Redis Mug"3) "price"4) "12.99"5) "stock"6) "200"HMGET product:1 name stock
HGETALL product:1HDEL และ HEXISTS
หัวข้อที่มีชื่อว่า “HDEL และ HEXISTS”HDEL key field [field ...] ลบหนึ่ง field หรือหลาย field และคืนค่าจำนวน field ที่ถูกลบจริง HEXISTS key field คืนค่า 1 หาก field นั้นมีอยู่ หรือ 0 หากไม่มี — เหมาะสำหรับตรวจสอบเงื่อนไขโดยไม่ต้องดึงค่า
127.0.0.1:6379> HEXISTS product:1 price(integer) 1127.0.0.1:6379> HEXISTS product:1 color(integer) 0127.0.0.1:6379> HDEL product:1 price(integer) 1127.0.0.1:6379> HEXISTS product:1 price(integer) 0HSET product:1 name "Redis Mug" price "12.99" stock "200"
HEXISTS product:1 price
HEXISTS product:1 color
HDEL product:1 price
HEXISTS product:1 price
HKEYS product:1
HVALS product:1
HLEN product:1HKEYS, HVALS, และ HLEN
หัวข้อที่มีชื่อว่า “HKEYS, HVALS, และ HLEN”HKEYS key คืนชื่อ field ทั้งหมด HVALS key คืนค่าของ field ทั้งหมด HLEN key คืนจำนวน field ทั้งหมดใน hash หลังจากลบ price ออกแล้ว hash นี้เหลืออยู่ 2 field คือ name และ stock
127.0.0.1:6379> HKEYS product:11) "name"2) "stock"127.0.0.1:6379> HVALS product:11) "Redis Mug"2) "200"127.0.0.1:6379> HLEN product:1(integer) 2ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| Hash (field แยกเป็น field-value) | อ่าน/เขียนทีละ field ได้โดยไม่ต้อง parse ทั้งก้อน (HGET/HSET) | ไม่มี nested structure ในตัว ต้อง flatten ข้อมูลที่ซับซ้อนเอง |
| String เก็บ JSON blob | เก็บโครงสร้างซับซ้อน/nested ได้ตามธรรมชาติ | ต้อง GET ทั้งก้อนแล้ว parse ทุกครั้ง แม้ต้องการแค่ field เดียว เขียนทับทั้งก้อนเสมอ |
HDEL ลบทีละ field | ลบเฉพาะ field ที่ไม่ต้องการได้ตรง ๆ โดยไม่กระทบ field อื่น | ต้องรู้ชื่อ field ล่วงหน้า ไม่มี wildcard delete ในตัว |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- เก็บ object เป็น JSON string แทนที่จะใช้ hash เมื่อ field ส่วนใหญ่เป็น flat key-value — เสีย round-trip parse/serialize ทุกครั้งที่อ่านหรือเขียนแค่ field เดียว
- ใช้
HGETALLกับ hash ที่มี field จำนวนมากบ่อย ๆ — โหลดทุก field เข้าหน่วยความจำ client ทั้งที่ต้องการแค่ 1-2 field ควรใช้HMGETหรือHGETแทน - ลืมว่า
HDELคืนค่าเป็นจำนวน field ที่ถูกลบจริง ไม่ใช่ boolean — เข้าใจผิดว่า return0คือ error ทั้งที่จริงหมายถึง field นั้นไม่มีอยู่ตั้งแต่แรก
💡 ตัวอย่างจากของจริง
Shopify — เก็บ attribute ของสินค้า (price, stock, name) เป็น Redis hash ต่อหนึ่ง product ทำให้อัปเดต stock ด้วย field เดียวได้เร็วโดยไม่กระทบ field อื่น
Twitch — ใช้ hash เก็บ state ของ stream (viewer count, title, category) ต่อหนึ่ง channel เพื่อให้ dashboard อ่านและอัปเดตแต่ละ field แยกกันแบบ real-time