Ch03-AmDB 之 ID 生成器

Ch03-AmDB 之 ID 生成器

December 3, 2022
AmDB
amdb

1. 接口 #

Status AllocateID(IDType type, const std::string& key, uint64_t* id);
Status BatchAllocateID(IDType type, const std::string& key, size_t batch_size, std::vector<uint64_t>* id_list);

2. ID 生成器分类 #

分类 说明
IDType::Database 生成 Database 级别的 ID
IDType::Table 生成 Table 级别的 ID
IDType::Column 生成 Column 级别的 ID

3. ID 生成器原理 #

3.1 基本原理 #

id-gen

这里以 IDType::Column 类型的生成器为例,cur_id 表示当前已经分配的 id,max_id 表示当前能分配的最大 id,left_num 表示能分配的 id 个数。 假如需要分配 n 个 id 的时候,首先将传进来的 key 取 hash 计算出具体的 bucket,然后判断 left_num 是否大于 n?

  • 如果大于则表示足够分配,那么就将 [cur_id+1,cur_id+n+1] 的所有数值返回。
  • 如果小于则表示不足够分配,那么重新计算当前 bucket 的 max_id 和 left_num,分配好之后将 [cur_id+1,cur_id+n+1] 返回。

3.2 计算公式 #

// fetch_num 为需要获取的 id 数量
new_max_id = old_max_id + bucket_capacity_ * fetch_num
left_num = fetch_num