为何写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的版本。
参考与感谢:
- 张宴2010年4月2日在“2010年数据库技术大会”的演讲PPT:Tokyo
Cabinet Key-Value数据库及其扩展应用PPT