前言
介绍
所谓kvstore就是类似于redis服务器的一种思想,通过自定义的一些协议,能够根据网络层recv到的数据进行解析,然后去到kvstore中的引擎层拿到想要的数据,最后封装组织回发。
自定义协议可以如下–CRUD:
- SET:set key value
- GET:get key
- DEL:del key
- MOD:mod key value
- EXIST:exist key
基于上一章节kvstore (一) 网络层设计,我们已经实现了将接收完数据后获取接收数据,并进行处理(上节只是做了简单打印)的函数kvs_protocol(char* msg , int length , char * response)通过函数指针的方式可以传递到各个网络框架的recv和send层面,本节就要对该业务方法进行实现。具体思路如下:
- 分割解析字符串 --msg:将字符串按照协议格式进行分割,并将指针存储到数组中。
kvs_filter_token(char*msg , char *token[]) - 解析字符串(过滤器/分析器):对分割后的字符串进行识别,并在其内部调用引擎层的方法,比如:
kvs_array_set()等方法
协议层设计
intkvs_protocol(char*msg,intlength,char*response){//其实此处按照协议格式只需要为3,但是为了防止set key value1 value2 ....这种,可以设定大一些char*tokens[kvs_max_tokens]={0};//分割字符串(为解析协议做准备)intcount=kvs_split_token(msg,tokens);//识别分割的字符串,并分别调用对应的业务逻辑set、get....returnkvs_filter_protocol(tokens,count,response);}1. 分割解析字符串
核心思想:
- 利用
strtok()方法,将msg进行“ ”分割,并且按照索引存到tokens数组中 - 分解后的
tokens[0]:set/get/mod/del,tokens[1]:key,tokens[2]:key
kvs_split_token(char*msg,char*tokens[]){......}2. 解析字符串tokens[0],tokens[1],tokens[2]…
2.1 定义一个枚举和指针数组
此处为了方便循环遍历,我么可以定义一个枚举,里面对应着指针数组char *command[]中的具体执行参数。
.........2.2 根据解析到的cmd,分别调用不同的方法
利用2.1中定义的方便遍历的enum,可以通过switch - case进行处理:
- KVS_CMD_SET:----
kvs_array_set - KVS_CMD_GET:----
kvs_array_get - KVS_CMD_MOD:----
kvs_array_MOD - KVS_CMD_EXIST:----
kvs_array_EXIST
......引擎array初步实现
根据上述所讲,已经可以实现接收到的数据包的解析,因此我们需要一个数据结构作为引擎对数据进行存储、修改、删除等
这里先使用简单的array数组捋清楚引擎层的思路,后续引入更为高效的数据结构。
数组数据结构图片 –