`
abear
  • 浏览: 21937 次
社区版块
存档分类
最新评论

【收藏】Tokyo Cabinet 的四种数据结构

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

Tokyo Tyrant在启动的时候,通过数据库文件名后缀来表示使用哪种数据结构。
以下是结构和后缀对应表:

Hash Database :.tch
B+ tree database :.tcb
fixed-length database :.tcf
table database :.tct
内存Hash Database :*
内存B+ tree database :+
启动时,还可以根据不同数据结构设置不同参数,用#开始,参数和值用=分开,例如/ttserver/database.tch#capnum=1#capsiz=1

参数含义如下,适用于TT:

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

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

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

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

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

创建数据库
Java代码 
[root@localhost ~]# tcfmgr create user.f 

[root@localhost ~]# tcfmgr create user.f
插入数据
Java代码 
[root@localhost ~]# tcfmgr put user.f 123 00 
[root@localhost ~]# tcfmgr put user.f 124 'aa' 

[root@localhost ~]# tcfmgr put user.f 123 00
[root@localhost ~]# tcfmgr put user.f 124 'aa'
查询
Java代码 
[root@localhost ~]# tcfmgr get user.f 123 
00 

[root@localhost ~]# tcfmgr get user.f 123
00

三、B+ Tree Database
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".

创建数据库
Java代码 
[root@localhost ~]# tcbmgr create user 

[root@localhost ~]# tcbmgr create user

插入记录,重复key
Java代码 
[root@localhost ~]# tcbmgr put -dd user u1 123 
[root@localhost ~]# tcbmgr put -dd user u1 456 
[root@localhost ~]# tcbmgr put -dd user u1 789 
[root@localhost ~]# tcbmgr put -dd user u2 abc  
[root@localhost ~]# tcbmgr put -dd user u2 efg 

[root@localhost ~]# tcbmgr put -dd user u1 123
[root@localhost ~]# tcbmgr put -dd user u1 456
[root@localhost ~]# tcbmgr put -dd user u1 789
[root@localhost ~]# tcbmgr put -dd user u2 abc
[root@localhost ~]# tcbmgr put -dd user u2 efg

查询所有记录
Java代码 
[root@localhost ~]# tcbmgr list -pv user  
u1      123 
u1      456 
u1      789 
u2      abc  
u2      efg 

[root@localhost ~]# tcbmgr list -pv user
u1      123
u1      456
u1      789
u2      abc
u2      efg

前缀查找
Java代码 
[root@localhost ~]# tcbmgr list -pv -fm u1 user  
u1      123 
u1      456 
u1      789 

[root@localhost ~]# tcbmgr list -pv -fm u1 user
u1      123
u1      456
u1      789

范围查找
Java代码 
[root@localhost ~]# tcbmgr list -pv -rb u1 u2 user  
u1      123 
u1      456 
u1      789 
u2      abc  
u2      efg 

[root@localhost ~]# tcbmgr list -pv -rb u1 u2 user
u1      123
u1      456
u1      789
u2      abc
u2      efg

四、Table Database
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".

1.类RMDB的表结构
Table Database最大的特点是支持类RMDB的表结构功能。
创建user表
Java代码 
[root@localhost ttserver]# tctmgr create user 

[root@localhost ttserver]# tctmgr create user
向表里插入记录
Java代码 
[root@localhost ttserver]# tctmgr put user 1 "name" "u1" "password" "123" 
[root@localhost ttserver]# tctmgr put user 3 "name" "u3" "password" "123456" 
[root@localhost ttserver]# tctmgr put user 9 "name" "u9" "password" "123456789" 

[root@localhost ttserver]# tctmgr put user 1 "name" "u1" "password" "123"
[root@localhost ttserver]# tctmgr put user 3 "name" "u3" "password" "123456"
[root@localhost ttserver]# tctmgr put user 9 "name" "u9" "password" "123456789"
删除记录
Java代码 
[root@localhost ttserver]# tctmgr out user 3 

[root@localhost ttserver]# tctmgr out user 3

2.查询
查询所有记录
Java代码 
[root@localhost ttserver]# tctmgr list -pv user  
1       name    u1      password        123 
3       name    u3      password        123456 
9       name    u9      password        123456789 

[root@localhost ttserver]# tctmgr list -pv user
1       name    u1      password        123
3       name    u3      password        123456
9       name    u9      password        123456789

通过主键查询
Java代码 
[root@localhost ttserver]# tctmgr get user 1 
name    u1  
password        123 

[root@localhost ttserver]# tctmgr get user 1
name    u1
password        123

通过其它字段查询
Java代码 
[root@localhost ttserver]# tctmgr search -pv user name STREQ "u1" 
1       name    u1      password        123 
[root@localhost ttserver]# tctmgr search -pv user name STREQ "u1" password STREQ "123" 
1       name    u1      password        123 

[root@localhost ttserver]# tctmgr search -pv user name STREQ "u1"
1       name    u1      password        123
[root@localhost ttserver]# tctmgr search -pv user name STREQ "u1" password STREQ "123"
1       name    u1      password        123
附查询条件表达式(前面加~,相当于标准sql中的非)[资料来源采用tokyo cabinet搭建表格型DBM]

STREQ :完全包含字符串,相当于标准sql中的where 字段=‘字符串’
STRINC :包含此字符串,相当于标准sql中like ‘*字符串*’
STRBW :以此字符串开头的内容,相当于标准sql中like ‘字符串*’
STREW :以此字符串结尾的内容,相当于标准sql中like ‘*字符串’
STRAND :包含在某区间内的内容,如标准sql中like ‘a-z’,那么他只能是a到z的字母
STROR :不包含在某区间内的内容,如标准sql中like ‘!a-z’,那么他只能是数字或其他的符号
STRRX :组合式结构,如标准sql中like “a“!b-m”#”
NUMEQ :数值大小一样 相当于标准sql中 where a=‘1’
NUMGT :数值大于某一值 相当于标准sql中 where a>‘1’
NUMGE :数值大于等于某一值 相当于标准sql中 where a>=‘1’
NUMLT :数值小于某一值 相当于标准sql中 where a<‘1’
NUMLE :数值小于某一值 相当于标准sql中 where a<=‘1’
NUMBT :数值处于某一数值区间,相当于标准sql中 where a> 1 and a < 10
NUMOREQ :数值不处于某一数值的区间,如果是a大于1,小于10的话,那这个表达式右边的内容应该相当于标准sql中 where a< 1 or a > 10
3.排序
Java代码 
[root@localhost ttserver]# tctmgr search -pv -ord name STRDESC user  
9       name    u9      password        123456789 
3       name    u3      password        123456 
1       name    u1      password        123 

[root@localhost ttserver]# tctmgr search -pv -ord name STRDESC user
9       name    u9      password        123456789
3       name    u3      password        123456
1       name    u1      password        123排序参数含义如下:
Java代码 
STRASC:按字符升序  
STRDESC:按字符降序  
NUMASC:按数字升序  
NUMDESC:按字符降序 

STRASC:按字符升序
STRDESC:按字符降序
NUMASC:按数字升序
NUMDESC:按字符降序

4.设置索引
Java代码 
[root@localhost ttserver]# tctmgr setindex -it "lexical" user name 

[root@localhost ttserver]# tctmgr setindex -it "lexical" user name
索引类型
Java代码 
lexical:词汇  
decimal:数字  
token:不明白  
qgram:不明白  
void:不明白 

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

5.tctmgr
tctmgr支持的命令和参数
Java代码 
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. 

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适配器,还整合了些方便使用的功能,TCSQL

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

参考资料:
Tokyo Cabinet: a modern implementation of DBM

分享到:
评论

相关推荐

    tokyo cabinet tyrant研究资料

    Tokyo Cabinet 是一个非关系型(NoSQL)的键值存储系统,它提供了多种数据结构,包括哈希表(Hash)、B树(B-Tree)和固定长度记录(Fixed-length Record)。这些数据结构设计使得Tokyo Cabinet在处理大量数据时具有...

    Tokyo-Cabinet.tar.gz

    HDB是Tokyo Cabinet中的另一种数据库引擎,采用哈希表作为底层数据结构。由于哈希表的特性,HDB在插入和查询操作上有着极高的性能,但在数据更新和删除时可能需要进行全表扫描。HDB适用于需要快速访问数据但对数据...

    Tokyo Cabinet-开源

    东京内阁支持两种主要的数据结构:哈希数据库和B树数据库。哈希数据库基于哈希表,提供了快速的键值查找,适合于需要快速插入、查询和删除操作的场景。哈希数据库通常在内存中完成大部分操作,因此它的性能通常非常...

    再说tokyocabinet 及其扩展

    3. **数据结构**:深入解析Tokyo Cabinet使用的B+树数据结构,以及它如何影响性能和存储效率。 4. **源码分析**:可能涉及关键函数的解读,以及如何通过修改源码来定制功能。 5. **性能评估**:与同类数据库的性能...

    tokyocabinet-1.4.45.tar.gz

    4. **数据分析**:对于需要快速读取和分析大量非结构化数据的项目,Tokyo Cabinet是一个理想的选择。 总之,Tokyo Cabinet是一个高性能、易于使用的键值存储解决方案,特别适合对速度和效率有高要求的场景。通过...

    tokyocabinet-1.4.47.tar.gz

    Tokyo Cabinet采用哈希表(Hash Table)、B+树(B+ Tree)和固定长度记录文件(Ft File)三种不同的数据结构,分别对应HDB、BDB和FDB三种数据库类型。这使得Tokyo Cabinet能够根据具体应用场景选择最合适的存储方式...

    tokyocabinet-1.4.48.tar.gz

    Tokyo Cabinet提供了两种主要的数据存储结构:哈希表(HashDB)和B+树(BtreeDB),这两种数据结构各有优势,能够适应不同的应用场景。哈希表适合于快速的查找和插入操作,而B+树则擅长处理大数据量的有序数据,提供...

    tokyoCabint及tokyoTyrant简介

    1. **高效性**:Tokyo Cabinet采用B+树的数据结构,这使得它在插入、查找和删除操作上的性能非常高。 2. **紧凑性**:它使用的文件格式紧凑,节省磁盘空间,对于大量小数据的存储非常有利。 3. **多种数据类型**:...

    memcached,mongdb,redis,Tokyo Tyrant的安装和使用

    例如,Memcached适合简单的键值对存储,MongoDB适合处理复杂的文档结构,Redis适用于需要高速读写和多数据结构操作的场景,而Tokyo Tyrant则提供了一个轻量级的解决方案。 在学习和使用过程中,可能会涉及到的知识...

    HTTPSQS源码分析

    - **消息队列实现**:为了实现消息队列的功能,HTTPSQS使用了一种特殊的数据结构来模拟队列行为。例如,在LogQueue队列中,每条消息都分配了一个唯一的键值,如`LogQueue:n` (n=1, 2, 3, ...),而`LogQueue:get`和`...

    tokyodb:东京内阁的Pharo包装纸

    2. **性能优化**:Tokyo Cabinet设计时考虑了高性能,使用B+树作为数据结构,提供高效的查找和更新操作。在内存映射模式下,Tokyo Cabinet能直接访问磁盘上的数据,减少了I/O操作。 3. **Pharo集成**:tokyodb库使...

    张宴httpsqs所有文件安装文件

    Tokyo Cabinet-1.4.47提供了B+树和哈希表两种数据结构,用于存储和检索大量数据。在HTTPSQS中,Tokyo Cabinet被用作持久化的数据存储,保存队列中的消息,确保数据在服务重启后仍然可恢复。 接下来,我们进入安装...

    TTserver1.1.4

    总的来说,Tokyo Tyrant作为一个高效的键值存储系统,为需要快速数据访问和简单数据结构的应用提供了可靠的支持。如果你正在使用或打算使用"TTserver1.1.4",理解Tokyo Tyrant的基本特性和工作原理将有助于优化你的...

    NoSQL技术交流.pptxNoSQL技术交流.pptx

    - **Tokyo Cabinet/Tokyo Tyrant (TC/TT)**:作为键值存储系统,适用于需要快速访问和简单数据结构的场景,如缓存服务或轻量级数据存储。 Tokyo Cabinet提供了多种数据存储方式,包括哈希数据库(TCHDB)、B+树...

    tokyocabinet.cr:TokyoCabinet的Crystal客户端

    1. **键值对存储**:TokyoCabinet采用键值对(Key-Value)的存储模式,支持B+树和哈希表两种数据结构,适用于大量无结构或半结构化数据的快速存取。 2. **高性能**:TokyoCabinet通过内存映射技术实现了高速的读写...

    分布式缓存tair的内部结构介绍

    fdb则类似于Tokyo Cabinet,为提高性能,索引和数据分开存储,索引保留在内存中。存储引擎的接口定义在`storage_manager.hpp`。 **plugin模块**: Tair支持插件式服务,允许开发自定义插件并动态加载。例如,可以...

    NoSQL笔记.doc

    例如,Redis以其内存存储和丰富的数据结构支持著称;Tokyo Cabinet因其高效的键值存储而闻名;Cassandra则因其分布式特性和高可用性受到青睐;MongoDB则提供了丰富的文档模型,适合处理结构化程度较低的数据。 总的...

    httpsqs4j队列所需要用到的jar包

    在IT行业中,队列是一种常用于处理高并发和异步任务的数据结构,它能有效地管理大量的请求并确保它们按照特定的顺序进行处理。`httpsqs4j` 是一个基于Java实现的高性能、高可用性的消息队列系统。在这个场景中,`...

    fortran-tcdb:与东京内阁的Fortran 2008接口绑定

    它提供Btree和Hash表两种数据结构,支持事务处理,并具有高并发读写能力。 4. **Fortran-Tcdb接口**: Fortran-Tcdb库为Fortran程序员提供了与Tokyo Cabinet数据库交互的API。这些接口允许创建、打开、关闭、读取...

    关系数据库还是NoSQL数据库.doc

    3. 键值存储:如Tokyo Cabinet/Tyrant、Berkeley DB、MemcacheDB和Redis,这类数据库以键值对形式存储数据,查询速度快,适用于缓存和快速访问场景。 4. 图存储:如Neo4J、FlockDB,专门用于存储和查询复杂的图形...

Global site tag (gtag.js) - Google Analytics