从零实现kv存储V2.0

V1.0版本,我们实现了基于array的kv存储引擎。本文继续完善,增加rbtree、hash、skiptable引擎。

实际上,在框架确定的基础上,其他的引擎只需要添加接口即可。

一、架构设计

在这里插入图片描述
在这里插入图片描述

二、具体实现

2.1 引擎层

//------------------------ array ------------------

typedef struct kvs_array_item_s {
	char *key;
	char *value;
} kvs_array_item_t;

// kvs_array_table 存储插入的 kv
kvs_array_item_t kvs_array_table [KVS_ARRAY_ITEM_SIEZ] = {0};

//--------------------- rbtree hash skiptable--------------
void init_kvengine(void) {
	init_rbtree(&tree);
	init_hashtable(&hash);
	init_skiptable(&table);
}


void dest_kvengine(void) {
	dest_rbtree(&tree);
	dest_hashtable(&hash);
	dest_skiptable(&table);
}

2.2 接口层

接口尽量做到一致,方便管理拓展。

//------------------------------ array --------------------------------

// 查找 key 在 kvs_array_table 的位置
kvs_array_item_t *kvs_array_search_item (char *key);

// KVS_CMD_EXIST: 判断 key 是否存在,存在返回 1 
int kvs_array_exist (char *key);

// KVS_CMD_SET:插入 kv
int kvs_array_set (char *key, char *value);

// KVS_CMD_GET:获取 key 对应的value
char *kvs_array_get(char *key);

// KVS_CMD_COUNT:统计以及插入多少个 key
int kvs_array_count (void) ;

// KVS_CMD_DELETE:删除 key
int kvs_array_delete(char *key);

//------------------------------ rbtree--------------------------------
// KVS_CMD_REXIST
int kvs_rbtree_exist (char *key) {
	return exist_kv_rbtree(&tree, key);
}

// KVS_CMD_RSET
int kvs_rbtree_set (char *key, char *value) {
	return put_kv_rbtree(&tree, key, value);
}

// KVS_CMD_RGET
char *kvs_rbtree_get (char *key) {
	return 	get_kv_rbtree(&tree, key);
}

// KVS_CMD_RCOUNT
int kvs_rbtree_count(void) {
	return count_kv_rbtree(&tree);
}
// KVS_CMD_RDELETE
int kvs_rbtree_delete(char *key) {
	return delete_kv_rbtree(&tree, key);
}

//------------------------------ hash--------------------------------

int kvs_hash_set(char *key, char *value)  {
	return put_kv_hashtable(&hash, key, value);
}

char *kvs_hash_get(char *key) {
	return 	get_kv_hashtable(&hash, key);
}

int kvs_hash_count(void) {
	return count_kv_hashtable(&hash);
}

int kvs_hash_exist(char *key) {
	return exist_kv_hashtable(&hash, key);
}

int kvs_hash_delete(char *key) {
	return delete_kv_hashtable(&hash, key);
}


//------------------------------ skiptable--------------------------------

int kvs_skiptable_set(char *key, char *value)  {
	return put_kv_skiptable(&table, key, value);
}

char *kvs_skiptable_get(char *key) {
	return 	get_kv_skiptable(&table, key);
}

int kvs_skiptable_count(void) {
	return count_kv_skiptable(&table);
}

int kvs_skiptable_exist(char *key) {
	return exist_kv_skiptable(&table, key);
}

int kvs_skiptable_delete(char *key) {
	return delete_kv_skiptable(&table, key);
}

2.3 协议层

// 根据msg,解析其具体的命令协议
int kvs_parser_protocol (char *msg, char **tokens, int count) ;

/*分割msg,比如 msg为 SET NAME ZXM ,分割为SET,NAME,ZXM,分别存储在tokens[]
 * tokens[0]: SET	--------- 对应的是命令 cmd
 * tokens[1]: NAME	--------- 对应的是命令 key
 * tokens[2]: ZXM	--------- 对应的是命令 value
 */
int kvs_spilt_tokens (char **tokens, char *msg) ;

// 解析协议
int kvs_protocol (char *msg, int length); 

2.4 网络层

纯c版本的协程实现NtyCo

// 为每一个连接端口创建一个协程
nty_coroutine_create(&co, server, port); 

2.5 功能测试结果

在这里插入图片描述

2.6 qps测试结果

在这里插入图片描述
增加了动态哈希

 ---------> array testcase 10w <-----------
time_used: 5897, qps: 16000 (request/second)
 ---------> rbtree testcase 10w <-----------
time_used: 6886, qps: 14000 (request/second)
 ---------> hash testcase 10w <-----------
time_used: 9696, qps: 10000 (request/second)
 ---------> dhash testcase 10w <-----------
time_used: 6042, qps: 16000 (request/second)
 ---------> skiptable testcase 10w <-----------
time_used: 12958, qps: 7000 (request/second)

三、完成代码

Github地址:KV存储引擎项目


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 10kV变400V主接线图是一种电力配电系统的图示,用于表示从高电压输电线路到低电压供电系统的变压器接线方式。这个主接线图一般包括变电站、变压器、开关设备和线路等部分。 变电站是将高电压(10kV)输电线路与低电压(400V)供电系统连接的关键部分。它通常由一个或多个变压器和开关设备组成。 变压器是主接线图中的关键组件之一,用于将高电压输电系统中的电能转换为低电压供电系统所需的电能。变压器一般由高压绕组和低压绕组组成,并通过绝缘材料绝缘。 开关设备包括断路器、隔离开关和负荷开关等,用于控制电能的流动和保护电力设备。断路器用于断开或接通电路,隔离开关用于将设备从电源分离,负荷开关用于控制电能的流向。 线路是主接线图中连接变电站和供电用户的电力传输路径。线路一般由导线和绝缘材料组成,用于传输电能。 10kV变400V主接线图通常使用标准符号和图形表示不同部件和设备,并通过连接线和箭头来表示电能的传输方向。它能清晰地展示电力系统的结构和工作原理,为工程师们提供了指导和参考。 总之,10kV变400V主接线图是一个重要的电力系统图纸,用于描述变电站、变压器、开关设备和线路等关键部件和设备之间的连接方式,以及电能的传输路径。它对于电力系统的运行和维护起着重要的作用。 ### 回答2: 10kV变400V主接线图是用来描述10千伏(kV)电压级别的高压系统如何通过变压器将电压降低为400伏(V)的低压系统。 主接线图通常包括变压器、高压侧开关设备、低压侧开关设备和负荷设备之间的连接关系。 在这个主接线图中,变压器是连接高压侧和低压侧的重要设备。高压侧通常称为主站侧,低压侧则称为配电侧。变压器内部有一个绕组,通过在绕组上设置不同的绕组匝数比例,可以实现电压的降低。 高压侧的开关设备主要用于控制高压系统的开关操作。这些开关设备通常包括断路器、隔离开关、负荷开关等。它们的作用是在需要时打开或关闭与高压系统相关的电路。 低压侧的开关设备主要用于控制低压配电系统的开关操作。这些开关设备通常包括空开、熔断器、接触器等。它们的作用是在需要时打开或关闭与低压系统相关的电路。 负荷设备是连接到低压侧的最终用电设备。这些设备可以是灯具、电气设备、电机等,它们通过低压配电系统获得电力供应。 综上所述,10kV变400V主接线图描述了变压器、高压侧开关设备、低压侧开关设备和负荷设备之间的连接关系,以实现电压从10kV降低到400V的过程。 ### 回答3: 10kv变400v主接线图是一种电力变压器的主要连接图,用于将电网中的高电压(10kv)转换为低电压(400v),以供给用户使用。这个接线图一般包括下面几个部分的连接: 1. 高压侧(10kv侧):主要包括高压侧的进线开关、绕组、避雷器等。进线开关用于连接电网,并起到保护作用。绕组是变压器的重要部分,用于将电流和电压进行转换。避雷器是为了保护变压器和其他设备免受雷击等高压干扰。 2. 低压侧(400v侧):主要包括低压侧的绕组、漏电保护器、仪表等。绕组将高压侧的电流和电压进一步降低,以适应用户的需求。漏电保护器用于检测电流的异常情况,以保护用户的安全。仪表则用于测量电流、电压等参数,以监测电力使用情况。 3. 中性点处理:中性点处理一般包括中性点接地和中性点直流滤波等。中性点接地是为了保护设备和人员免受电压过高的影响,通过将中性点接地来降低电压。中性点直流滤波则用于减少直流成分的干扰。 4. 控制回路:控制回路一般包括变压器的保护、控制和监测等设备。这些设备用于保护变压器免受故障和过载等问题的影响,并提供控制和监测功能。 总之,10kv变400v主接线图是一个详细描述电力变压器内部各个部件连接方式的图示,它通过合理地连接各个部件,实现了高电压到低电压的变换,并确保了电力供应的可靠性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲谈社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值