通过写代码学习AWS DynamoDB(1)

AWS的DynamoDB是一款非常受欢迎的Non-SQL数据库。DDB的实现应用了非常多的分布式系统的技术,例如SHARD,eventual consistency,consistency Hash等。我们通过模拟一个简单的DDB的实现,可以更好的理解这些技术是如何工作的。

在本文中我们首先用python实现DDB的最基本的API,包括table有关的API,和table本身的API。DDB作为Non-SQL数据库,是以key-value的方式存储数据的。也就是说每一行记录都有一个primary key(partition key + sort key)。DDB的所有操作都是基于key-value的存储方式建立的。我们在这里将value进行简化,只存储一个string类型。将key进行简化为一个string类型。首先我们先看DDB实现的第一个版本:

# class to provide DDB public APIs
class DDB:
    def __init__(self):
        self.tables = {}

    def create_table(self, table_name):
        self.tables[table_name] = self.Table(table_name)

    def list_table(self):
        for table in self.tables.values():
            table.describe()

    def delete_table(self, table_name):
        self.tables.pop(table_name)

    def get_table(self, table_name):
        return self.tables[table_name]
    
    class Table:
        def __init__(self, name):
            self.rows = {}
            self.name = name

        def put_item(self, key, value):
            self.rows[key] = value

        def update_item(self, key, value):
            self.rows.update(key, value)

        def get_item(self, key):
            return self.rows[key]
        
        def delete_item(self, key):
            self.rows.pop(key)

        def describe(self):
            print("Table name: {}, item size: {}".format(self.name, len(self.rows)))

我们目前实现了DDB级别的如下API:

  • create_table() - 创建table
  • list_table() - 展示table列表
  • delete_table() - 删除table
  • get_table() - 获取table

实现了Table级别的如下API:

  • put_item() - 创建记录
  • update_item() - 更新记录
  • get_item() - 获取记录
  • delete_item() - 删除记录
  • describe() - 给出table描述

Class diagram现在看起来是这个样子:

通过写代码学习AWS DynamoDB(1)_第1张图片

下面我们写一个简单的测试代码:

from ddb import DDB

ddb = DDB()

table_name = "test_table"
key = "test_key"
value = "test_value"

ddb.create_table(table_name)
ddb.list_table()
ddb_table = ddb.get_table(table_name)
ddb_table.put_item(key, value)
print(ddb_table.get_item(key))
ddb_table.update_item(key, "updated value")
print(ddb_table.get_item(key))
ddb_table.describe()
ddb_table.delete_item(key)
ddb_table.describe()

测试代码的输出:

Table name: test_table, item size: 0
test_value
updated value
Table name: test_table, item size: 1
Table name: test_table, item size: 0

现在的实现是建立在单一环境中的。我们会在下面的实现中先给table加入Shard。通过Shard,DDB的存在可以方便的scale out。敬请关注后续的文章。

你可能感兴趣的:(学习,aws,云计算)