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 immediatelyevents = 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 ++){...//第二个重点 分配Jobthis->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文件的改写,以免编译报错。当然添加一个接口后肯定是为了做些什么我们假定新的接口模式为Read1.Read参考proc_get可以看到,使用serv->ssdb->get(Key,Out),其它类型的Read操作同理可得int ret = serv->ssdb->get(req[1], &val);2.Write
如果新接口的模式为Write参考1.Read即可。此时,我们需要向WriteWorker投递Job。需要注意的是你可能需要在之前提到的后续处理动作中做一些额外的事情,具体视情况而定。目前为止一个简单的接口就添加成功了当然,本文并没有考虑集群的问题