Computer >> Máy Tính >  >> Lập trình >> Cơ sở dữ liệu

Sử dụng hàm băm trong Redis

Sử dụng hàm băm trong Redis

Hàm băm trong Redis là một cách để lưu trữ các cặp giá trị trường được liên kết dưới một khóa duy nhất, trong đó cả trường và giá trị đều là chuỗi. Redis cho phép sửa đổi cả cấu trúc dữ liệu nói chung và cho từng trường trong cấu trúc. Điều này làm cho nó trở thành một kho dự phòng tuyệt vời (và rất nhanh) cho các đối tượng trong một ứng dụng.

Ví dụ CLI

Tạo một băm với hai trường:

127.0.0.1:6379> HMSET my_hash key1 "foo" key2 "bar"
OK

Liệt kê các trường và giá trị được liên kết với hàm băm:

127.0.0.1:6379> HGETALL my_hash
1) "key1"
2) "foo"
3) "key2"
4) "bar"

Cập nhật giá trị của một trong các trường:

127.0.0.1:6379> HSET my_hash key1 "xyzzy"
(integer) 0
127.0.0.1:6379> HGET my_hash key1
"xyzzy"

Xóa một trường khỏi hàm băm:

127.0.0.1:6379> HDEL my_hash key2
(integer) 1
127.0.0.1:6379> HGETALL my_hash
1) "key1"
2) "xyzzy"

Xóa hàm băm:

127.0.0.1:6379> DEL my_hash
(integer) 1
127.0.0.1:6379> HGETALL my_hash
(empty list or set)

Tài liệu tuyệt vời của Redis có thêm thông tin về các lệnh có sẵn cho hàm băm. Tôi sẽ không sao chép / dán từ đó cho bạn; thay vào đó, chúng ta sẽ vui vẻ một chút với họ.

Dwemthy’s Array!

Dwemthy’s Array là một trò chơi nhập vai (RPG) ví dụ nhỏ được viết bởi Why the Lucky Stiff trong Hướng dẫn về Ruby của Why’s (thơ mộng) để giúp giải thích về lập trình siêu hình Ruby. Ở đây, chúng ta sẽ lấy cùng một ý tưởng RPG và triển khai nó bằng cách sử dụng hàm băm Redis (với một chút trợ giúp từ mảng Redis).

Chúng tôi sẽ tạo một hàm băm cho mỗi con quái vật trong mảng, trông giống như sau:

name: "AssistantViceTentacleAndOmbudsman"
life: 320
strength: 6
charisma: 144
weapon: 50

Đây là một ví dụ đi sâu vào mảng:

>>> 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!]"

Và đây là toàn bộ mã, nếu bạn muốn làm theo:dwemthy.py

Mã nổi bật

Thứ nhất, khi người dùng tạo mảng với phương thức gốc được cung cấp, chúng tôi sẽ thiết lập cấu trúc dữ liệu của mình và trả về đối tượng dwemthy.Array mới:

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 ở đây tạo ra một hàm băm cho kẻ xấu. Khi điều đó xảy ra, chúng tôi đẩy khóa của kẻ xấu vào danh sách Redis, danh sách này đang được sử dụng ở đây như một hàng đợi đơn giản.

Khi tất cả kẻ xấu được thiết lập, chúng tôi đảm bảo rằng kẻ ở đầu mảng đã sẵn sàng với phương thức 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"])

Tự [“tên”] trên dòng cuối cùng được thực hiện bằng cách xác định các phương thức __setitem__ và __getitem__ trên đối tượng mảng. Điều này cho phép chúng tôi coi mảng chủ yếu là một lệnh python và cho phép dễ dàng tìm nạp và sửa đổi các trường trên kẻ xấu hiện tại:

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

Kết luận

Có vô số cách mà Redis cho phép chúng ta sửa đổi hàm băm cho phép các nhà phát triển sử dụng nó để giải quyết một loạt các vấn đề. Hy vọng rằng bài đăng này đã cung cấp cho bạn ý tưởng để sử dụng trong các dự án của riêng bạn.