SSDB 添加接口

SSDB 的源码要比Redis的看上去舒服的多

第一步还是找到入口点

在ssdb-server.cpp 中可以清晰的看到主要的循环在net->serve();:
int main(int argc, char **argv){
    ...
	log_info("ssdb server started.");
	net->serve();
    ...
}
 
 
接着了解一下主循环
在server()中看到了第一个重要的信息
void NetworkServer::serve(){
    writer = new ProcWorkerPool("writer");
    writer->start(WRITER_THREADS);
    reader = new ProcWorkerPool("reader");
    reader->start(READER_THREADS);
    ...
SSDB的多线程的工作模式(1*WriteWorker + 10*ReadWorker) 当然你可以尝试修改Worker的数量,
如果有人测试过多线程Write的请告诉我测试结果,
下面的前提是保持一个WriteWorker
接下来是主线程的循环工作
while(!quit){
    ....
    //等待I/O信号,具体的是用到了epoll_wait方法
    if(!ready_list.empty()){
        // ready_list not empty, so we should return immediately
        events = fdes->wait(0);
    }else{
        events = fdes->wait(50);
    }
    ...
    for(int i=0; i<(int)events->size(); i++){
        ...
            //第一个重点,当一个Job被完成后的处理动作proc_result
            }else if(fde->data.ptr == this->reader || fde->data.ptr == this->writer){
                ProcWorkerPool *worker = (ProcWorkerPool *)fde->data.ptr;
                ProcJob job;
		if(worker->pop(&job) == 0){
		    log_fatal("reading result from workers error!");
		    exit(0);
		}
		if(proc_result(&job, &ready_list) == PROC_ERROR){
					//
		}
        ...
    }
    ...
    for(it = ready_list.begin(); it != ready_list.end(); it ++){
        ...
        //第二个重点 分配Job
        this->proc(&job);
        ...
    }
    ...
}
void NetworkServer::proc(ProcJob *job)中可以发现Job的添加只需要调用ProcWorkerPool *writer;或ProcWorkerPool *reader;的push()方法即可,并没有其它需要处理的动作

了解基本流程后开始尝试添加接口
首先是定义:
 1.link_redis.cpp -> cmds_raw 记录了Redis中命令与SSDB的对应关系
 2.serv.cpp -> reg_proces 中将SSDB的接口名(不是Redis的接口名,虽然它们可能一样),接口模式,和接口方法名添加到一
 3.serv.cpp -> DEF_PROC({接口名}) 接口方法的申明
个Map中
接着是实现:
 你可以按照SSDB的习惯,将新的接口实现放在proc_hash.cpp中。当然你也可以独立一个文件或写在其它地方,如果是这样的话需要注意makefile文件的改写,以免编译报错。
当然添加一个接口后肯定是为了做些什么
我们假定新的接口模式为Read
 1.Read 
 参考proc_get可以看到,使用serv->ssdb->get(Key,Out),其它类型的Read操作同理可得
 int ret = serv->ssdb->get(req[1], &val);
 2.Write
 如果新接口的模式为Write参考1.Read即可。此时,我们需要向WriteWorker投递Job。需要注意的是你可能需要在之前提到的后续处理动作中做一些额外的事情,具体视情况而定。
目前为止一个简单的接口就添加成功了
当然,本文并没有考虑集群的问题

   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值