·ChinaUnix首页 ·论坛 ·博客 
Linux首页 | Linux新闻 | Linux论坛 | Linux文档 | Linux下载 | Linux博客 | Linux搜索 | 开源项目孵化平台 | 《开源时代》
新手入门 | 安装启动 | 管理员指南 | 开发手册 | 桌面应用 | 程序开发 | 数据库 | 网络技术| CentOS | Fedora | MySQL | Apache | Ubuntu | Gentoo| OSCON08
  Linux时代 >> 技术文档 >> 程序开发
 
Webdis内部解析
来源: linux频道  日期: 2012.03.16 16:00 (共有条评论) 我要评论
 

Webdis内部解析






Webdis是redis的http代理,源代码在:git://github.com/nicolasff/webdis.git

webdis.json是配置文件

webdis.c是入口程序



其中有三个比较重要的结构:



?



123456789101112131415161718

struct server {     int fd;     struct event ev;    struct event_base *base;   //libevent的event事件     struct conf *cfg;  //配置文件,设置有多少个进程(http_threads)啥的放在里面     /* worker threads */    struct worker **w;  //有多个worker,父进程有多少worker线程    int next_worker;     /* log lock */    struct {        pid_t self;        int fd;    } log;  //日志结构};







?



12345678910111213

struct worker {     /* self */    pthread_t thread;      struct event_base *base;  //libevent的event事件     /* connection dispatcher */    struct server *s;  //父server    int link[2]; //由pipe建立的管道,link[0]是管道读取端,link[1]是管道写入端     /* Redis connection pool */    struct pool *pool;  //连接池,与redis连接的连接池};



?



12345678910111213

struct pool { struct worker *w; //worker线程 struct conf *cfg; //配置文件 const redisAsyncContext **ac; //redis的同步上下文 int count; //pool大小,即s->cfg->pool_size_per_thread int cur; };

  

这三个结构每个结构都有一个指针指向父结构,比如pool的worker*

这样能保证从任意一个结构中都能取得父结构的需要的属性

  

  

webdis的server-worker-pool的关系是这样的:

一个Server包含多个worker,每个woker占一个进程的资源

一个worker包含一个pool

Server的任务是接受HTTP请求,传递HTTP的套接字给worker

Worker才是webdis的实际处理类,一方面接受Server传递过来的HTTP请求,一方面由pool保持和redis的连接

Pool是连接池,保持了与redis的连接,防止重复的连接操作造成过多的资源浪费

  

webdis的入口是Webdis.c文件

主要运行了:

Server_new(conf)

server_start(s)

  

-------------------------------new 的过程开始----------------------------------------

Server_new主要函数:

conf_read

worker_new * n

  

worker_new主要函数:

Pipe(w->link) //建立管道

w->pool = pool_new(w, s->cfg->pool_size_per_thread);

  

pool_new主要函数:

p->ac = calloc(count, sizeof(redisAsyncContext*));

p->cfg = w->s->cfg;

  

pool中有一个redisAsyncContext结构,这个结构是hiredis的范围了:

Hiredis是redis的C客户端库

https://github.com/antirez/hiredis

Hiredis is a minimalistic C client library for the Redis database.

  

Hiredis:

使用方法大是:



?



123456789101112131415

redisAsyncContext *c = redisAsyncConnect("127.0.0.1", 6379); int redisAsyncCommand( redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, ...); int redisAsyncCommandArgv( redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen); void redisAsyncDisconnect(redisAsyncContext *ac);



?



1

-------------------------------new 的过程结束----------------------------------------



?



1

   



?



1

-------------------------------start 的过程开始---------------------------------------

server_start主要函数:





?



1234567891011121314151617

s->base = event_base_new(); //注册一个事件 worker_start(s->w); //开启worker s->fd = socket_setup(s->cfg->http_host, s->cfg->http_port); //建立socket   /* start http server */ event_set(&s->ev, s->fd, EV_READ | EV_PERSIST, server_can_accept, s); event_base_set(s->base, &s->ev); event_add(&s->ev, NULL); event_base_dispatch(s->base);



worker_start主要函数:



?



1

pthread_create(&w->thread, NULL, worker_main, w);//开了一个线程来运行worker_main函数

worker_main主要函数:



?



123456789101112

w->base = event_base_new(); //注册event /* monitor pipe link */event_set(&ev, w->link[0], EV_READ | EV_PERSIST, worker_on_new_client, w);event_base_set(w->base, &ev);event_add(&ev, NULL); /* connect to Redis */worker_pool_connect(w); //worker和pool的连接,即worker和redis的连接 /* loop */event_base_dispatch(w->base);

worker_pool_connect主要函数:



?



1

pool_connect(w->pool, 1); //指定w->pool来连接redis



pool_connect主要函数: //连接redis



?



123456789

ac = redisAsyncConnect(p->cfg->redis_host, p->cfg->redis_port); redisLibeventAttach(ac, p->w->base); redisAsyncSetConnectCallback(ac, pool_on_connect); redisAsyncSetDisconnectCallback(ac, pool_on_disconnect); redisAsyncCommand(ac, NULL, NULL, "AUTH %s", p->cfg->redis_auth);



?



1

下面就进入到了hiredis的部分了



?



1

-------------------------------start 的过程结束---------------------------------------



?



1

   

----------------------

作者:yjf512(轩脉刃)

出处:http://www.cnblogs.com/yjf512/

本文版权归yjf512和cnBlog共有,欢迎转载,但未经作者同意必须保留此段声明
  发表评论 查看评论(共有条评论)
 
 


最新资讯更多>> 
· 谷歌劝说诺基亚采用Android操作..
· Apache 基金会确认退出 JCP 执..
· Chrome 10 新功能探秘:新增GP..
· 金山宣布开源其安全软件
· 女黑客在开源会议上抱受骚扰
· 21款值得关注的Linux游戏
· 马化腾:腾讯半年后彻底转型,..
· [多图] Chrome OS 预发布版本多..
· Lubuntu 11.04 默认应用抢先一览
· Red Hat宣布收购云计算软件提供..
论坛热点更多>> 
· do_execve时候用户栈中参数的..
· swapinfo -atm 问题
· Linux 的优点简述
· VM虚拟机上得Red Hat Linux上..
· 我看成了上海男人喜欢女人毛..
· 校车展览,看了你就知道
· 在遇到他之前,唯一需要做的..
· GRUB的疑问
· 从来没有人真正付足书价——..
· 云存储 vs 网盘
文档更新更多>> 
· orcale queue
· 谁可以推荐几本经典的操作系统的..
· 【北京】某物联网公司招云计算应..
· 【北京】某物联网公司招云计算应..
· 谁能推荐几本关于操作系统的书
· 如何添加网络接口eth1
· 葡萄牙语入门教材的选取与经验分享
· 葡萄牙语就业前景分析
· 葡萄牙语学习经验交流
· Щ
 
关于我们 | 联系方式 | 广告合作 | 诚聘英才 | 网站地图 | 友情链接 | 免费注册

Copyright © 2001-2009 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们

京ICP证:060528号