资 源 简 介
mh_cache是我新写的一个项目,主要功能是作为一种插件的形式放在web server的前端,就像计算机体系结构中cache和内存的关系一样,通过先在mh_cache缓存一部分数据来分流web server的压力。举个例子:比如web server是一个学生管理系统,提供了选课、在线考试、成绩查询等服务。当学期结束,也就是考试结束,可能学生最关心的事情就是成绩怎么样啊,可能在这一刻会有很多学生并发访问服务器去得到自己的成绩,那有了mh_cache就可以把学生成绩放在我这个mh_cache中,并且使用学生ID这个键值来做HASH,这样学生访问web server时会先访问到mh_cache,然后利用自己的键值,hash后可以很快得到自己成绩的索引,根据索引定位到hashtable的槽位,可以在线性级时间内找到自己的成绩,这样既提高了查询速度,有缓解了web server的压力!
设计原理:
存储数据部分使用了HASH TABLE来实现,主要为了提高效率,选择了链接法来解决冲突。
每个数据都有一个lifetime,以便在过期后清理。
在mh_cache缓存满了的时候,就要删除节点来获得内存,此时根据OS的页面调度算法FIFO、LRU、RR等,目前采用的是FIFO,使用另外一个数据结构队列来提供在缓存满了时候,清理内存的依据,队列的节点只存储key值,在删除时,从队头pop出后,拿着key到HASH TABLE上找HASH NODE,找到删除,直到内存够用为止!
更新自2009-5-18,目前增加了LRU算法来清除节点,跟FIFO相比,可能对cache的命中率会提高,但是每次删除前都要去看一下hashnode,效率不够好!
并发服务器:
并发方式选择的是多线程,没有使用我在多进程并发服务器中常用的“watcher--worker”模式,而是通过线程属性设置线程在创建伊始就和当前进程detach掉,成为独立的线程,这样就交给了系统来处理,避免了主线程wait子线程式join的麻烦,以及可能引起的内存泄漏!
I/O方式使用的是非阻塞I/O方式,你应该能明白为什么没用