网站制作学习网Linux→正文:TCADB
字体:

TCADB

Linux 2015/5/15 11:58:05  点击:不统计

http://%77w%77%2E%66%6F%72%61%73%70%2E%63n网站制作学习
 转自 http://iammutex.com/html/ycategory/%E6%8A%80%E6%9C%AF/tokyotyrant

 
首先说一个TC中的核心数据结构:TCADB
 
typedef struct {                         /* type of structure for an abstract database */
  int omode;                             /* open mode */
  TCMDB *mdb;                            /* on-memory hash database object */
  TCNDB *ndb;                            /* on-memory tree database object */
  TCHDB *hdb;                            /* hash database object */
  TCBDB *bdb;                            /* B+ tree database object */
  TCFDB *fdb;                            /* fixed-length databae object */
  TCTDB *tdb;                            /* table database object */
  int64_t capnum;                        /* capacity number of records */
  int64_t capsiz;                        /* capacity size of using memory */
  uint32_t capcnt;                       /* count for capacity check */
  BDBCUR *cur;                           /* cursor of B+ tree */
  void *skel;                            /* skeleton database */
} TCADB;
 
 
数据结构的申明就在这了,注释基本清楚,说一下不清楚的几个注释:
 
omode:注释说是open mode,意为这个TCADB对象打开的模式,在没有skeleton之前,这个omode主要是用来标明这个TC是哪种存储方式,hash,B+,table,fixed-length等。有了skeleton之后,他多了一个作用,当加载了skeleton共享模块后,或者当使用了内置的skeleton实现-mul选项后,omode会被指定为ADBOSKEL,这是一个枚举值,也是在有了skeleton之后加入的。
 
skel:这个参数前面一篇文章说过,他就是skeleton机制的核心实现,这个结构体包含所有数据操作的函数指针,比如put,get,out等,只要用自定义的函数复写skel结构体的属性,就可以达到自定义存储模式的效果。当然,他也是skeleton机制出现后才位列入TCADB结构体的属性的。
 
TCADB的功能:
 
好了,说了属性。那TCADB这个结构体主要是干什么的呢?其实它就是一个接口层,从上面注释可以看出。他是一个抽象的database,他其实就做了一个代理的功能。要创建一个真实的TC数据存储,实际是通过创建一个TCADB结构来实现的,具体函数是tcadbnew()。
 
在没有skeleton机制以前,TCADB功能比较纯粹,就是作为一个数据层库逻辑上的代理。记录了一个TC库的各种信息。
 
在有了skeleton之后,他的角色做了一些变化,可以说是分裂了一下。首先,它还是面向TT的逻辑层数据库代理。所有操作都是通过它实现 ,具体是往hash表里写数据,还是往B+树里面写数据,他说了算。其次,他还有了一个功能,就是面向skel的数据抽象,这个不太好理解。我通过调用过程来跟大家说明一下:
 
一个TC数据库的创建有两步:tcadbnew() -> tcadbopen()
 
在tcadbnew()函数调用的时候,会创建一个TCADB实例,而如果有skeleton模块加载,那么这个实例的omode和skel属性就会被赋予相应的值。tcadbopen()的时候,就是建立真实数据文件的时候,这时候,实际上是调用了skel->open这个函数,拿-mul来说,-mul模式下,这个函数指向的是tcadbmulopen()函数,也就是说不是用原始的创建方式创建数据文件了。
 
tcadbmulopen()实际是根据-mul选项指定的数据文件个数,双再循环调用了多次tcadbnew()和tcadbopen(),以创建多个TC数据库实例。
 
上面一说,可能你发现了,这调用貌似一个圈,像死循环一样,从tcadbnew()开始,又回来再循环调用了它。其实不然,后面的调用是简单形式的调用,不再有skeleton选项的调用,就是和原始的创建一个数据库的形式一样。也可以这么想,这里循环创建的多个TCADB实例,他的skel属性是没有值的。omode也不会是ADBOSKEL。
 
TCADB的双重角色
 
下面总结一下,TCADB这个结构体的实例,充当了两层角色,一是对TT来说透明的数据接口层,他全层只有一个,二是对TC来说的透明的调用层,他是上面的循环创建的,全局会有多个。
 
个人觉得将这一个数据结构分另担任这两个用途不是一个太优雅的做法,但是从过去的代码上来看,作者也是没办法。因为在过去,这两层功能是在一个点上实现的,只需要一个TCADB就可以搞定,现在出来个skeleton层,放在TC和TT之间,所以只能把一张纸两面变两张,从中间剥开了。

http://%77%77%77%2E%66%6F%72%61%73%70%2E%63%6E

·上一篇:linux网络监控 网卡监控 那个程序占用网络大 >>    ·下一篇:linux 中文消失 php调用java 中文丢失 >>
推荐文章
最新文章