俺的回收站

架构分析 解释编译原理
posts - 42, comments - 214, trackbacks - 12, articles - 1
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2010年5月7日

前面一篇: tcdatabase-1

搜索操作:根据“字段”检索出符合条件的key

cmd: misc search/metasearch [addcond/cond\0{fieldName}\0{condOperator}\0{Value}...[next] addcond/cond...] [setorder/order\0{fieldName}\0{OrderType}] [setlimit/limit/setmax/max)\0{MaxCount}[\0{SkipCount}]] [columns/get\0{FieldName1}\0{FieldNameN}] [mstype\0{SearchType}] [out/remove] [count] [hint]

搜索操作是通过search/metasearch命令进行,并可以支持联合查询。

参数描述:
  • * addcond/cond: 添加条件,多个条件构成一个查询,同查询之间为与(并且)关系。
    •   * fieldName为条件的字段名
    •   * condOperator代表操作类型,
    •   * value为操作对象
  • * next: 联合查询的下一个查询的开始,接下来的addcond为下一个查询。
  • * mstype: 表示联合查询之间的关系,默认是合并(OR)关系,可以是合并(OR),交集(AND)或不同(DIFF)。不过一次联合查询只能有一种关系(mstype)。
  • * setorder/order: 为这次查询指定一个排序字段,得到的结果集合将按该字段的指定方式排序。
    •   * orderType为排序类型,值如下:
    •     * STRASC:表示按照文本型字段内的文本内容在字典中排列顺序的升序。
    •     * STRDESC:表示按照文本型字段内的文本内容在字典中排列顺序的降序。
    •     * NUMASC:表示按照数值大小的升序。
    •     * NUMDESC:表示按照数值大小的降序
  • * setlimit/limit/setmax/max: 限制检索结果数量,相当于SQL语句中的“limit skip, max”。
  • * columns/get: 设置后,将不仅仅返回符合查询的keys,而且将获取指定列的值。如果只指定了columns没有指定字段,则将返回所有列的值。
  • * out/remove: 将删除符合查询的结果记录集,同时将删除的keys返回。
  • * count: 返回符合查询的记录数。
  • * hint: 将打印执行查询的调试信息。

操作类型可以分为:字符型运算,数值型运算,token型运算,全文检索型运算。
数值型运算符:
  • * NUMEQ:表示等于操作对象的数值(=)。
  • * NUMGT:表示比操作对象的数值要大(>)。
  • * NUMGE:表大于或等于操作对象的数值(>=)。
  • * NUMLT:表示比操作对象的数值要小(<)。
  • * NUMLE:表示小于或等于操作对象的数值(<=)。
  • * NUMBT:表示其大小处于操作对象文字段中被逗号分开的两个数值的中间(between 100 and 200)。
  • * NUMOREQ:表示同操作对象文字段中被逗号分开的多个数值中的其中一个是相同的( IN (100,200,278))
文本型运算符:
  • * STREQ:表示与操作对象的文字内容完全相同(=)。
  • * STRINC:表示含有操作对象文字的内容(LIKE ‘%文字%’)。
  • * STRBW:表示以操作对象的文字行列开始(LIKE ‘文字%’)。
  • * STREW:表示到操作对象的文字行列结束(LIKE ‘%文字’) 。
  • * STRAND:表示包含操作对象的文字行列中右逗号分开部分的字 段的全部(name LIKE ‘%文字(一)%’ AND name LIKE ‘%文字(二)%’)。
  • * STROR:表示包含操作对象文字段中逗号分开部分的其中一部分 (name LIKE ‘%文字(一)%’ OR name LIKE ‘%文字(二)%’) 。
  • * STROREQ:表示与操作对象文字段中逗号分开部分的其中某部分完全相同( name = ‘文字(一)’ OR name =‘文字(二)’ )。

设置索引操作

misc setindex name type
可以对“字段”建立索引, 暂不支持支持全文检索
  • * name:待索引的字段名称;
  • * type为索引类型,值如下:
    •   * TDBITLEXICAL(0):创建文本型索引
    •   * TDBITDECIMAL(1):创建数值型索引
    •   * TDBITTOKEN(2):创建标记倒排索引 ,暂不支持
    •   * TDBITQGRAM(3):创建q-gram倒排索引 ,暂不支持
    •   * TDBITOPT(9998):优化索引
    •   * TDBITVOID(9999):删除索引
    •   * TDBITREINDEX(10000): 重建索引

posted @ 2010-05-07 16:28 Riceball LEE 阅读(476) 评论(3) 编辑

为何写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的版本。

 

参考与感谢:

posted @ 2010-05-07 07:00 Riceball LEE 阅读(642) 评论(0) 编辑