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

Hashes

Redis Hashes เก็บคู่ field-value หลายรายการไว้ภายใต้ key เดียว ลองนึกภาพเป็น dictionary แบบ flat หรือแถวข้อมูลในฐานข้อมูล — หนึ่ง key เก็บได้หลาย field ที่มีชื่อแยกกัน

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) 3
127.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-field

HMGET key field [field ...] ดึงหลาย field ในครั้งเดียว และคืนค่า (nil) สำหรับ field ที่ไม่มีอยู่ HGETALL key คืนค่าคู่ field-value ทั้งหมดในรูปแบบรายการสลับกันระหว่างชื่อ field และค่า

127.0.0.1:6379> HMGET product:1 name stock
1) "Redis Mug"
2) "200"
127.0.0.1:6379> HGETALL product:1
1) "name"
2) "Redis Mug"
3) "price"
4) "12.99"
5) "stock"
6) "200"
HMGET product:1 name stock
HGETALL product:1

HDEL key field [field ...] ลบหนึ่ง field หรือหลาย field และคืนค่าจำนวน field ที่ถูกลบจริง HEXISTS key field คืนค่า 1 หาก field นั้นมีอยู่ หรือ 0 หากไม่มี — เหมาะสำหรับตรวจสอบเงื่อนไขโดยไม่ต้องดึงค่า

127.0.0.1:6379> HEXISTS product:1 price
(integer) 1
127.0.0.1:6379> HEXISTS product:1 color
(integer) 0
127.0.0.1:6379> HDEL product:1 price
(integer) 1
127.0.0.1:6379> HEXISTS product:1 price
(integer) 0
HSET 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:1

HKEYS key คืนชื่อ field ทั้งหมด HVALS key คืนค่าของ field ทั้งหมด HLEN key คืนจำนวน field ทั้งหมดใน hash หลังจากลบ price ออกแล้ว hash นี้เหลืออยู่ 2 field คือ name และ stock

127.0.0.1:6379> HKEYS product:1
1) "name"
2) "stock"
127.0.0.1:6379> HVALS product:1
1) "Redis Mug"
2) "200"
127.0.0.1:6379> HLEN product:1
(integer) 2
ตัวเลือกBenefitCost
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 — เข้าใจผิดว่า return 0 คือ 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

คำสั่งใดที่คืนค่าคู่ field-value ทั้งหมดของ hash?
`HGET key missing-field` จะคืนค่าอะไร?
`HSET user:1 name 'Ana' age '30'` สร้าง field กี่ field?
คำสั่งใดนับจำนวน field ใน hash?