রেডিসে হ্যাশ হলো একটি একক কি-এর অধীনে ফিল্ড-ভ্যালু জোড়া সংরক্ষণের পদ্ধতি, যেখানে ফিল্ড এবং ভ্যালু দুটোই স্ট্রিং। রেডিস ডেটা স্ট্রাকচার সমগ্রে এবং প্রতিটি ফিল্ডে আলাদাভাবেও পরিবর্তন করার সুবিধা দেয়। এতে এটি অ্যাপ্লিকেশনের অবজেক্টের জন্য একটি দ্রুত এবং উপযুক্ত ব্যাকিং স্টোর হয়ে ওঠে।
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)
রেডিসের চমৎকার ডকুমেন্টেশনে হ্যাশের জন্য উপলব্ধ কমান্ড সম্পর্কে আরও তথ্য পাওয়া যাবে। এখানে কপি-পেস্ট না করে আমরা এখানে একটু মজা করব।
ডোয়েমথির অ্যারে!
ডোয়েমথির অ্যারে হলো একটি ছোট রোল প্লেয়িং গেম (RPG) যা হোয়াই দ্যা লাকি স্টিফ লেখেন Why's (poignant) Guide to Ruby-এ রুবি মেটা-প্রোগ্রামিং ব্যাখ্যা করার জন্য। এখানে আমরা একই RPG আইডিয়া রেডিস হ্যাশ (এবং একটু রেডিস অ্যারি помощи) দিয়ে ইমপ্লিমেন্ট করব।
অ্যারেতে প্রতিটি মন্সটারের জন্য একটি হ্যাশ তৈরি করব, যা এমন দেখাবে:
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 ব্যাড গায়ের জন্য একটি হ্যাশ তৈরি করে। এরপর ব্যাড গায়ের কি একটি রেডিস লিস্টে পুশ করা হয়, যা এখানে একটি সিম্পল কিউ হিসেবে কাজ করছে।
সব ব্যাড গায় সেটআপ হয়ে যাওয়ার পর, আমরা অ্যারের হেডে থাকা ব্যাড গায় কে 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"])
শেষ লাইনের self["name"] করা হয়েছে __setitem__ এবং __getitem__ মেথড অ্যারে অবজেক্টে ডিফাইন করে। এতে আমরা অ্যারেকে প্রায় একটি পাইথন ডিক্টের মতো ব্যবহার করতে পারি, যা বর্তমান ব্যাড গায়ের ফিল্ড সহজে ফেচ ও মডিফাই করতে দেয়:
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
উপসংহার
রেডিস হ্যাশ মডিফাই করার বহুবিধ পদ্ধতি ডেভেলপারদের সমস্যার একটি বড় সেট সমাধান করতে সক্ষম করে। আশা করি এই পোস্ট আপনার নিজস্ব প্রজেক্টে ব্যবহার করার আইডিয়া দিয়েছে।