Tokyo Cabinet 的四种数据结构

Tokyo Cabinet提供了Hash、Fixed-length、Table和B+ Tree四种数据结构,不同的结构特性和应用场景都不一样。TC本身提供了专门测试和调试工具tc (h/f/t/b) mgr。

Tokyo Tyrant在启动的时候,通过数据库文件名后缀来表示使用哪种数据结构。
以下是结构和后缀对应表:
[list]
[*][b]Hash Database[/b] :.tch
[*][b]B+ tree database[/b] :.tcb
[*][b]fixed-length database[/b] :.tcf
[*][b]table database[/b] :.tct
[*][b]内存Hash Database[/b] :*
[*][b]内存B+ tree database[/b] :+
[/list]启动时,还可以根据不同数据结构设置不同参数,用#开始,参数和值用=分开,例如/ttserver/database.tch#capnum=1#capsiz=1

参数含义如下,适用于TT:
[list]
[*][b]capnum[/b] :设置记录的最大容量
[*][b]capsiz[/b] :设置内存型database的内存容量,内存不足记录将按照顺序移除
[*][b]mode[/b] : 可选的选项:w (写)、r (读)、c (创建)、t (截断)、t (无锁)、f (非阻塞锁)。默认值为 :wc
[*][b]idx[/b] :设置索引的列名,用:分割
[*][b]opts[/b] :可选的选项:l (64位bucket数组,database容量可以超过2G)、d (Deflate压缩)、b(BZIP2压缩)、t(TCBS压缩)
[*][b]bnum[/b] :bucket的数量
[*][b]apow[/b] :specifies the size of record alignment by power of 2. 如果负数,设置无效
[*][b]fpow[/b] :specifies the maximum number of elements of the free block pool by power of 2. 如果负数,设置无效
[*][b]rcnum[/b] :设置缓存记录的最大数,如果数值不是大于0则会禁用缓存,默认禁用
[*][b]lcnum[/b] :设置缓存叶节点(leaf nodes)的最大数,如果数值不是大于0则会禁用缓存,默认值4096
[*][b]ncnum[/b] :设置缓存非叶节点(non-leaf nodes)的最大数,如果数值不是大于0则会禁用缓存,默认值512
[*][b]xmsiz[/b] :设置额外内存映射容量,如果数值不是大于0则会禁用内存映射,默认值67108864
[*][b]dfunit[/b] :specifie the unit step number. If it is not more than 0, the auto defragmentation is disabled. It is disabled by default.
[*][b]width[/b] :设置记录的固定大小,如果数值不是大于0,则默认是255
[*][b]limsiz[/b] :设置数据库文件的大小,如果数值不是大于0,则默认是268435456
[*][b]lmemb[/b] :设置每个叶节点页(leaf page)的成员数,如果数值不是大于0,则默认是128
[*][b]nmemb[/b] :设置每个非叶节点页(non-leaf page)的成员数,如果数值不是大于0,则默认是256
[/list]TC有自己的一套读写缓冲机制,通过xmsiz设置内存缓冲大小,这个参数对整体性能影响比较大。

[size=medium][b]一、Hash Database[/b][/size]
Hash Database是最基本的结构了,只提供key-value存储方式,类似于memcached,Hash Database的特点是查找速度很快,bucket越多,数据越分散,查找越快。

Hash database支持的参数有:"mode", "bnum", "apow", "fpow", "opts", "rcnum", "xmsiz", 和 "dfunit".
内存Hash Database支持的参数有:"bnum", "capnum", 和 "capsiz"

[size=medium][b]二、Fixed-length Database[/b][/size]
Fixed-length Database的读写速度是最快的,并且存储所需的空间是最小的(因为不需要存储数据以外的结构关系,但是因为是定长的,所以会有空间浪费),key只能是数字,而value的长度是有限的,所以必须设置一个合适的value长度,太长会浪费空间,间接影响性能(TPS)。

Fixed-length database支持的参数有:"mode", "width", 和 "limsiz".

创建数据库
[code="java"]# tcfmgr create user.f[/code]
插入数据
[code="java"]# tcfmgr put user.f 123 00
# tcfmgr put user.f 124 'aa'[/code]
查询
[code="java"]# tcfmgr get user.f 123
00[/code]

[size=medium][b]三、B+ Tree Database[/b][/size]
B+ Tree Database的特点是一个key可以有重复value,而且允许在value之间上下移动,value按插入顺序排列,可以范围查找key,也可以前缀查找key,查找的复杂度是O(log n),所以n越大性能越低。

B+ tree database支持的参数有:"mode", "lmemb", "nmemb", "bnum", "apow", "fpow", "opts", "lcnum", "ncnum", "xmsiz", and "dfunit"
内存B+ Tree Database支持的参数有:"capnum" and "capsiz".

创建数据库
[code="java"]# tcbmgr create user[/code]

插入记录,重复key
[code="java"]# tcbmgr put -dd user u1 123
# tcbmgr put -dd user u1 456
# tcbmgr put -dd user u1 789
# tcbmgr put -dd user u2 abc
# tcbmgr put -dd user u2 efg[/code]

查询所有记录
[code="java"]# tcbmgr list -pv user
u1 123
u1 456
u1 789
u2 abc
u2 efg[/code]

前缀查找
[code="java"]# tcbmgr list -pv -fm u1 user
u1 123
u1 456
u1 789[/code]

范围查找
[code="java"]# tcbmgr list -pv -rb u1 u2 user
u1 123
u1 456
u1 789
u2 abc
u2 efg[/code]

[size=medium][b]四、Table Database[/b][/size]
Table Database的特点是支持检索,支持多列字段,支持列索引,性能不如其它结构。
Table Database提供了类似RMDB的存储功能,一个主键可以有多个字段,例如,在RMDB中user表可能会有user_id、name和password等字段,而在Table Database也提供这种支持。

Table database支持的参数有:"mode", "bnum", "apow", "fpow", "opts", "rcnum", "lcnum", "ncnum", "xmsiz", "dfunit", and "idx".

[b]1.类RMDB的表结构[/b]
Table Database最大的特点是支持类RMDB的表结构功能。
创建user表
[code="java"]# tctmgr create user[/code]
向表里插入记录
[code="java"]# tctmgr put user 1 "name" "u1" "password" "123"
# tctmgr put user 3 "name" "u3" "password" "123456"
# tctmgr put user 9 "name" "u9" "password" "123456789"[/code]
删除记录
[code="java"]# tctmgr out user 3[/code]

[b]2.查询[/b]
查询所有记录
[code="java"]# tctmgr list -pv user
1 name u1 password 123
3 name u3 password 123456
9 name u9 password 123456789[/code]

通过主键查询
[code="java"]# tctmgr get user 1
name u1
password 123[/code]

通过其它字段查询
[code="java"]# tctmgr search -pv user name STREQ "u1"
1 name u1 password 123
# tctmgr search -pv user name STREQ "u1" password STREQ "123"
1 name u1 password 123[/code]
附查询条件表达式(前面加~,相当于标准sql中的非)[资料来源[url=http://zhliji2.blogspot.com/2009/05/tokyo-cabinetdbm.html]采用tokyo cabinet搭建表格型DBM[/url]]
[list]
[*][b]STREQ[/b] :完全包含字符串,相当于标准sql中的where 字段=‘字符串’
[*][b]STRINC[/b] :包含此字符串,相当于标准sql中like ‘*字符串*’
[*][b]STRBW[/b] :以此字符串开头的内容,相当于标准sql中like ‘字符串*’
[*][b]STREW[/b] :以此字符串结尾的内容,相当于标准sql中like ‘*字符串’
[*][b]STRAND[/b] :包含在某区间内的内容,如标准sql中like ‘a-z’,那么他只能是a到z的字母
[*][b]STROR[/b] :不包含在某区间内的内容,如标准sql中like ‘!a-z’,那么他只能是数字或其他的符号
[*][b]STRRX[/b] :组合式结构,如标准sql中like “a“!b-m”#”
[*][b]NUMEQ[/b] :数值大小一样 相当于标准sql中 where a=‘1’
[*][b]NUMGT[/b] :数值大于某一值 相当于标准sql中 where a>‘1’
[*][b]NUMGE[/b] :数值大于等于某一值 相当于标准sql中 where a>=‘1’
[*][b]NUMLT[/b] :数值小于某一值 相当于标准sql中 where a<‘1’
[*][b]NUMLE[/b] :数值小于某一值 相当于标准sql中 where a<=‘1’
[*][b]NUMBT[/b] :数值处于某一数值区间,相当于标准sql中 where a> 1 and a < 10
[*][b]NUMOREQ[/b] :数值不处于某一数值的区间,如果是a大于1,小于10的话,那这个表达式右边的内容应该相当于标准sql中 where a< 1 or a > 10
[/list][b]3.排序[/b]
[code="java"]# tctmgr search -pv -ord name STRDESC user
9 name u9 password 123456789
3 name u3 password 123456
1 name u1 password 123[/code]排序参数含义如下:
STRASC:按字符升序
STRDESC:按字符降序
NUMASC:按数字升序
NUMDESC:按字符降序


[b]4.设置索引[/b]
[code="java"]# tctmgr setindex -it "lexical" user name[/code]
索引类型

lexical:词汇
decimal:数字
token:不明白
qgram:不明白
void:不明白


[b]5.tctmgr[/b]
tctmgr支持的命令和参数
tctmgr create [-tl] [-td|-tb|-tt|-tx] path [bnum [apow [fpow]]]
创建数据库
tctmgr inform [-nl|-nb] path
输出数据库的状况
tctmgr put [-nl|-nb] [-sx] [-dk|-dc|-dai|-dad] path pkey [cols ...]
创建记录
tctmgr out [-nl|-nb] [-sx] path pkey
删除记录
tctmgr get [-nl|-nb] [-sx] [-px] [-pz] path pkey
通过主键查询记录
tctmgr list [-nl|-nb] [-m num] [-pv] [-px] [-fm str] path
输出所有记录
tctmgr search [-nl|-nb] [-ord name type] [-m num] [-sk num] [-kw] [-pv] [-px] [-ph] [-bt num] [-rm] [-ms type] path [name op expr ...]
通过自定义条件查询记录
tctmgr optimize [-tl] [-td|-tb|-tt|-tx] [-tz] [-nl|-nb] [-df] path [bnum [apow [fpow]]]
优化数据库
tctmgr setindex [-nl|-nb] [-it type] path name
设置索引
tctmgr importtsv [-nl|-nb] [-sc] path [file]
Store records of TSV in each line of a file.
tctmgr version
Print the version information of Tokyo Cabinet.

金山公司在Table Database的基础上,提供了SQL适配器,还整合了些方便使用的功能,[url=http://blog.s135.com/tcsql/]TCSQL[/url]

TC博大精深,还有太多没有理解的地方,错误在所谓难免,不妥之处请予赐教。。

参考资料:
[url=http://1978th.net/tokyocabinet/]Tokyo Cabinet: a modern implementation of DBM [/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值