从零实现kv存储V2.0

news2025/1/21 0:54:37

在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测试结果

在这里插入图片描述

三、完成代码

Github地址:KV存储引擎项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/883916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第14集丨Vue2 基础 —— 生命周期

目录 一、引子1.1 实现一1.2 一个死循环的写法1.3 mounted实现 二、生命周期2.1 概念2.2 常用的生命周期钩子2.3 关于销毁Vue实例注意点2.4 vm的一生(vm的生命周期)2.5 生命周期图示 每个 Vue 实例在被创建时都要经过一系列的初始化过程——例如,需要设置数据监听、…

轻量级自动化测试框架WebZ

一、什么是WebZ WebZ是我用Python写的“关键字驱动”的自动化测试框架,基于WebDriver。 设计该框架的初衷是:用自动化测试让测试人员从一些简单却重复的测试中解放出来。之所以用“关键字驱动”模式是因为我觉得这样能让测试人员(测试执行人员…

企业权限管理(十三)-用户关联角色操作

用户关联角色操作 从前台发送请求 <a href"${pageContext.request.contextPath}/user/findUserByIdAndAllRole.do?id${user.id}" class"btn bg-olive btn-xs">添加角色</a>查询用户以及用户可以添加的角色 usercontroller //查询用户以及用…

k8s 自身原理之 Service

好不容易&#xff0c;终于来到 k8s 自身的原理之 关于 Service 的一部分了 前面我们用 2 个简图展示了 pod 之间和 pod 与 node 之间是如何通信息的&#xff0c;且通信的数据包是不会经过 NAT 网络地址转换的 那么 Service 又是如何实现呢&#xff1f; Service 我们知道是用…

网神 SecGate 3600 防火墙任意文件上传漏洞复现

0x01 产品简介 网神SecGate3600下一代极速防火墙&#xff08;NSG系列&#xff09;是基于完全自主研发、经受市场检验的成熟稳定网神第三代SecOS操作系统 并且在专业防火墙、VPN、IPS的多年产品经验积累基础上精心研发的高性能下一代防火墙 专门为运营商、政府、军队、教育、大型…

图扑数字孪生智慧乡村综合管控平台

数字乡村是伴随网络化、信息化和数字化在农业农村经济社会发展中的应用&#xff0c;既是乡村振兴的战略方向&#xff0c;也是建设数字中国的重要内容。为了进一步提升乡村治理智能化、专业化水平&#xff0c;解决建设顶层缺失、数据孤岛等问题&#xff0c;数字孪生技术被广泛应…

工控机防病毒

2月3日&#xff0c;作为全球最大的半导体制造设备和服务供应商&#xff0c;美国应用材料公司&#xff08;Applied Materials&#xff09;表示&#xff0c;有一家上游供应商遭到勒索软件攻击&#xff0c;由此产生的关联影响预计将给下季度造成2.5亿美元&#xff08;约合人民币17…

使用MAT分析OOM问题

OOM和内存泄漏在我们的工作中&#xff0c;算是相对比较容易出现的问题&#xff0c;一旦出现了这个问题&#xff0c;我们就需要对堆进行分析。 一般情况下&#xff0c;我们生产应用都会设置这样的JVM参数&#xff0c;以便在出现OOM时&#xff0c;可以dump出堆内存文件&#xff…

JavaScript进阶 第二天

深入对象内置构造函数 一. 深入对象 创建对象三种方式构造函数实例成员&静态成员 1.1 创建对象三种方式 ① 利用对象字面量创建对象 const o {name: 哈哈 } ② 利用new Object 创建对象 const o new Object({ name: 哈哈 }) ③ 构造函数创建对象 1.2 构造函数 …

致远OA M1Server RCE漏洞复现

0x01 产品简介 致远M1移动协同软件&#xff0c;结合移动应用特色的信息终端&#xff0c;帮您高效管理&#xff0c;掌控全局&#xff1b;基于移动互联技术的产品&#xff0c;实现全天候在线&#xff0c;随时随地了解企业信息&#xff1b;触控式操作&#xff0c;舒适的滑动体验&a…

Prim+Kruskal(最小生成树)

Prim算法求最小生成树 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。 求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。 给定一张边带权的无向图 G(V,E)&#xff0c;其中 V 表示图中点的集…

FPGA:RS编码仿真过程

FPGA&#xff1a;RS编码仿真过程 RS码是一种纠错性能很强的线性纠错码&#xff0c;能够纠正随机错误和突发错误。RS码是一种多进制BCH码&#xff0c;能够同时纠正多个码元错误。 之前已经记录了在MATLAB中进行rs编解码的过程&#xff0c;现在利用FPGA的IP核实现RS编码的过程&…

Hlang社区-社区导航栏实现

文章目录 前言项目结构导航实现创作中心移动小球消息提示完整代码前言 okey,这里的话是我们社区导航栏的实现: 废话不多说,看看效果: 我甚至为此用New Bing生成了一个Logo。 项目结构 废话不多说,先来看到我们的项目结构: 在这里导航栏是一个组件。 在App.vue里面直…

POST请求负载form-data表单数据需要同步修改header的Content-type

需要读公司的一个接口&#xff0c;显示负载是“表单数据” 一开始没注意类型&#xff0c;按照公司其他接口的情况用了json&#xff0c;结果返回的数据时间阶段没有体现dct的要求&#xff0c;脚本如下&#xff08;错误示范&#xff09; from requests import post from json im…

企业权限管理(十六)-aop日志

SysLog实体类 public class SysLog {private String id;private Date visitTime;private String visitTimeStr;private String username;private String ip;private String url;private Long executionTime;private String method;public String getId() {return id;}public v…

Request+Response

文章目录 1. 介绍2. Request对象2.1 Request继承体系2.2 Request获取请求数据1.获取请求行2.获取请求头3.获取请求体4. 请求参数的通用方式5. 解决中文乱码问题 2.3 Request请求转发请求转发资源间共享数据: 3. Response对象3.0 Response 继承体系3.1 Response设置响应数据的功…

RK3288Android7.1上10寸mipi屏兼容

需求&#xff1a;RK3288Android7.1上10寸mipi屏兼容 思路&#xff1a; 1、修改屏幕厂商提供的屏幕初始化指令为rk可以识别的格式存放在panel-init-sequence 2、修改屏参display-timings 3、确定reset-gpio 实现&#xff1a; 首先根据屏幕厂商提供的初始化指令将panel-init-seq…

AMS的起源,SystemServer的前世今生

作者&#xff1a;OpenGL 前世 SystemServer的创建还得追溯到之前的Zygote进程中的ZygoteInit代码中。这里的Zygote.forkSystemServer()方法就是实现分裂的关键代码。它内部调用了native方法实现了进程分裂。 执行完这行代码之后。我们的系统中就会出现两个一模一样的进程&…

复现基于PYNQ-Z2的手写数字识别卷积加速器设计

来源雪天鱼 基于PYNQ-Z2的手写数字识别卷积加速器设计【持续更新】_雪天鱼的博客-CSDN博客 一、设计思路 1、输入28 x 28 的图片&#xff0c;非png格式&#xff0c;而是txt格式&#xff0c;将图片数据进行量化&#xff0c;存入到txt文件当中。 2、在PL端实现卷积神经网络LeN…

关于Linux Docker springboot jar 日志时间不正确 问题解决

使用Springboot项目的jar&#xff0c;制作了一个Docker镜像&#xff0c;启动该镜像后发现容器和容器中的Springboot 项目的日志时间不正确。 解决 查看容器时间命令为&#xff1a; docker exec 容器id date 1. 容器与宿主机同步时间 在启动镜像时候把操作系统的时间通过&q…