俺的回收站

架构分析 解释编译原理
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

tcdatabase(一)

Posted on 2010-05-07 07:00  Riceball LEE  阅读(1373)  评论(0编辑  收藏  举报

为何写tcdatabase

tcdatabase 是以TC(Tokyo Cabinet)的B+Tree 数据引擎为基础开发的数据库。


TC(Tokyo Cabinet)是日本人平林幹雄开发的一款 Key-Value 键值数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.402秒,读取100万条数据 只需0.334秒。
TT(Tokyo Tyrant )是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有自己的协议,并支持Memcached兼容协议,也可以通过HTTP协议进行 数据交换。哈希数据库读写速度大约在50000次/秒。
TC和TT目前运行在日本最大的SNS网站MIXI,在国内也有大量的生产环境应用。

关于TC和TT详尽的介绍可以看看张宴2010年4月2日在“2010年数据库技术大会”的演讲PPT:Tokyo Cabinet Key-Value数据库及其扩展应用PPT

在TC中key-value数据对中value有结构并能对value中字段进行索引的数据引擎是TCTDB(Table Database)。TCTDB是在TCHDB哈希数据库的基础上,对value部分做的增强:value是带字段结构,value是由若干字段名-字段值对组成。(详见张宴PPT)。

 

TCTDB即具备了Key-Value数据库的高效读写性能,又具备了MySQL单表能实现的一些功能,即: SELECT .... FROM table WHERE .... ORDER BY .... LIMIT xxx,xxx


TCTDB的不足:
  • * 一个Table Database仅支持一个表,也就是说value中的字段必须固定一样。假设项目组使用了80多个表,这意味着你需要开启了80多个 ttserver为每一个“表”提供支持。
  • * 功能的增强,也就意味着要牺牲性能。TCTDB 表格型数据库的平均读取速度大约在40万条/秒,相比 TCHDB哈希数据库的180万条/秒和TCBDB B+Tree数据库 的100万条/秒要慢。
  • * TCTDB虽然可以建立数值型索引,但是它是将所有value数据都当成字符型来处理的,无法区分value类型。
  • * TCTDB单数据库文件存储的记录数上亿条后,性能会有比较明显的下降。
  • * 不能单独获取value中的某一个字段的值;
  • * 不能支持仅更新UPDATE key中某一个字段:必须先取出value的全部字段,再存入;
  • * 查询没有时间限制,如果有一个超大数据量的查询就可以把服务搞僵死

So,为了解决TCTDB一个database只能使用一个表,以及不能获取(更新)value中某个字段值的问题,我动了写tcdatabase的念头。
目前tcdatabase 数据格式为Spec.2. 当前Spec.2的实现功能如下。

tcdatabase的数据存储

tcdatabase的数据存储被分为3个文件进行存储:分别是数据文件、数据配置文件、数据索引文件。
* 1、[data.tcb]: 数据文件改用采用TCBDB(B+Tree Database)进行存储,——为了解决数据量上亿后的HashDB性能的问题。
* 2、[data.tcb].cfg: 数据配置采用TCHDB(Hash Database), 只要内存缓存设置适当配置信息就会在内存中。
* 3、[data.tcb].idx: 索引同样采用TCBDB存储。

注意:字段名称必须在整个数据库中保持唯一。暂不支持全文索引。

 

tcdatabase兼具TCBDB和TCTDB的特点。主要特点如下:


读写操作

写操作

 

写操作分为行写和列写操作。

行写:和TCTDB完全一样,写入整行(row)数据,包含所有字段。
分为 misc put, misc putcat, misc putkeep
misc putkeep: 添加新记录,如果企图覆盖已有记录会报错。
misc put: 添加新记录或者覆盖已有记录,注意覆盖的新值中不能有新字段。
misc putcat 覆盖已有记录并可以给已有记录添加新字段。

列写:和TCBDB一样。仅对key的单列进行写入
put(".[KeyName].[FieldName]", "FieldValue")
必须使用put命令进行(不能使用 misc put,这是行写方式)。
必须以"."字符打头表示列写方式,keyName和字段名之间用"."分隔。

读操作

读操作也分为行读和列读操作。

行读操作:和TCTDB完全一样,读取整行(row)数据,包含所有字段。
misc get(char * name)

列读操作:和TCBDB一样。可以读取某key的单列值的信息,也可以获取某key的字段列表信息
读取单列:get(".[KeyName].[FieldName]")
读取key的字段名称列表信息:get("/[KeyName]")
必须使用get命令进行(不能使用 misc get,这是行读方式)。

 

tcdatabase 开源

tcdatabase: http:code.google.com/p/tcdatabase

注意:当前你必须从代码仓库中checkout方为Spec.2的最新版本,下载包中的为Spec.1的版本。

 

参考与感谢: