แฮชใน Redis เป็นวิธีการจัดเก็บคู่ของฟิลด์-ค่าที่เกี่ยวข้องภายใต้คีย์เดียว โดยที่ทั้งฟิลด์และค่าต่างเป็นสตริง Redis อนุญาตให้แก้ไขทั้งโครงสร้างข้อมูลโดยรวม และแต่ละฟิลด์ในโครงสร้างด้วย สิ่งนี้ทำให้เป็นพื้นที่สำรองข้อมูลที่ยอดเยี่ยม (และเร็วมาก) สำหรับออบเจ็กต์ในแอปพลิเคชัน
ตัวอย่าง CLI
สร้างแฮชที่มีสองช่อง:
127.0.0.1:6379> HMSET my_hash key1 "foo" key2 "bar"
OK
ระบุฟิลด์และค่าที่เกี่ยวข้องกับแฮช:
127.0.0.1:6379> HGETALL my_hash
1) "key1"
2) "foo"
3) "key2"
4) "bar"
อัปเดตค่าของหนึ่งในฟิลด์:
127.0.0.1:6379> HSET my_hash key1 "xyzzy"
(integer) 0
127.0.0.1:6379> HGET my_hash key1
"xyzzy"
ลบฟิลด์เดียวจากแฮช:
127.0.0.1:6379> HDEL my_hash key2
(integer) 1
127.0.0.1:6379> HGETALL my_hash
1) "key1"
2) "xyzzy"
ลบแฮช:
127.0.0.1:6379> DEL my_hash
(integer) 1
127.0.0.1:6379> HGETALL my_hash
(empty list or set)
เอกสารประกอบที่ยอดเยี่ยมของ Redis มีข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งที่ใช้ได้สำหรับแฮช ฉันจะไม่คัดลอก/วางจากที่นั่นเพื่อคุณ แต่เราจะสนุกไปกับพวกเขาแทน
Dwemthy's Array!
Dwemthy's Array เป็นเกมเล่นตามบทบาท (RPG) ตัวอย่างเล็กๆ น้อยๆ ที่เขียนโดย Why the Lucky Stiff ใน ทำไม (ฉุนเฉียว) คู่มือ Ruby เพื่อช่วยอธิบาย Ruby metaprogramming ในที่นี้ เราจะใช้แนวคิด RPG แบบเดียวกัน และนำไปใช้โดยใช้แฮช Redis (ด้วยความช่วยเหลือเล็กน้อยจากอาร์เรย์ Redis)
เราจะสร้างแฮชสำหรับมอนสเตอร์แต่ละตัวในอาร์เรย์ โดยมีลักษณะดังนี้:
name: "AssistantViceTentacleAndOmbudsman"
life: 320
strength: 6
charisma: 144
weapon: 50
ต่อไปนี้คือตัวอย่างการดำดิ่งสู่ส่วนลึกของอาร์เรย์:
>>> import redis
>>> import dwemthy
>>> conn = redis.StrictRedis(host="localhost", port=6379)
>>> dw = dwemthy.Array.new(conn,
{
"name": "AssistantViceTentacleAndOmbudsman",
"life": 320,
"strength": 6,
"charisma": 144,
"weapon": 50
}
)
"[Get ready. AssistantViceTentacleAndOmbudsman has emerged!]"
>>> rabbit = dwemthy.Rabbit(dw)
>>> rabbit.sword()
"[You hit with 2 points of damage!]"
"[Your enemy hit with 10 points of damage!]"
"[Rabbit has died!]"
และนี่คือรหัสโดยรวม หากคุณต้องการปฏิบัติตาม:dwemthy.py
โค้ดไฮไลท์
ประการแรก เมื่อผู้ใช้สร้างอาร์เรย์ด้วยวิธีการของโรงงานที่มีให้ เราจะตั้งค่าโครงสร้างข้อมูลและส่งคืนอ็อบเจ็กต์ dwemthy.Array ใหม่:
class Array(object):
list_key = "dwemethys_array"
...
@classmethod
def new(cls, conn, *bad_guys):
""" Create a new set of problems for our hero to boomerang! """
conn.delete(cls.list_key)
# Give each bad guy a cozy spot in the array!
for bad_guy in bad_guys:
key = uuid.uuid4()
conn.hmset(key, bad_guy)
conn.rpush(cls.list_key, key)
dw_list = cls(conn)
dw_list.next_enemy()
return dw_list
conn.hmset ที่นี่สร้างแฮชสำหรับคนเลว เมื่อสิ่งนั้นเกิดขึ้น เราจะกดคีย์ของคนเลวลงในรายการ Redis ซึ่งใช้ที่นี่เป็นคิวง่ายๆ
เมื่อตั้งค่าตัวร้ายทั้งหมดแล้ว เราตรวจสอบให้แน่ใจว่าตัวที่ส่วนหัวของอาร์เรย์นั้นพร้อมสำหรับเมธอด Array.next_enemy():
class Array(object):
list_key = "dwemethys_array"
...
def next_enemy(self):
""" Bring out the next enemy for our rabbit to face! """
# We're moving on!
if self.current != None:
self.conn.delete(self.current)
enemy_key = self.conn.lpop(self.list_key)
if enemy_key is None:
# Like a boss!
print "[Whoa. You decimated Dwemthy's List!]"
else:
# Get the new enemy ready!
self.current = enemy_key
print "[Get ready. {} has emerged!]".format(self["name"])
ตัวเอง[“ชื่อ”] ในบรรทัดสุดท้ายทำได้โดยการกำหนดเมธอด __setitem__ และ __getitem__ บนอ็อบเจ็กต์อาร์เรย์ วิธีนี้ช่วยให้เราปฏิบัติต่ออาร์เรย์เสมือนเป็น dict ของไพ ธ อนเป็นส่วนใหญ่ และช่วยให้สามารถดึงและแก้ไขฟิลด์ของตัวร้ายปัจจุบันได้อย่างง่ายดาย:
class Array(object):
...
def __setitem__(self, key, value):
self.conn.hset(self.current, key, value)
def __getitem__(self, key):
value = self.conn.hget(self.current, key)
# hashes only store strings!
if key != "name":
return int(value)
return value
บทสรุป
วิธีมากมายที่ Redis ช่วยให้เราแก้ไขแฮชทำให้นักพัฒนาสามารถใช้มันเพื่อแก้ปัญหาชุดใหญ่ได้ หวังว่าโพสต์นี้จะให้แนวคิดแก่คุณเพื่อใช้ในโครงการของคุณเอง