Tokyo Cabinet的四种数据结构

2024-03-08 05:50

本文主要是介绍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代码   收藏代码
  1. [root@localhost ~]# tcfmgr create user.f  

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

查询
Java代码   收藏代码
  1. [root@localhost ~]# tcfmgr get user.f 123  
  2. 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代码   收藏代码
  1. [root@localhost ~]# tcbmgr create user  


插入记录,重复key
Java代码   收藏代码
  1. [root@localhost ~]# tcbmgr put -dd user u1 123  
  2. [root@localhost ~]# tcbmgr put -dd user u1 456  
  3. [root@localhost ~]# tcbmgr put -dd user u1 789  
  4. [root@localhost ~]# tcbmgr put -dd user u2 abc  
  5. [root@localhost ~]# tcbmgr put -dd user u2 efg  


查询所有记录
Java代码   收藏代码
  1. [root@localhost ~]# tcbmgr list -pv user  
  2. u1      123  
  3. u1      456  
  4. u1      789  
  5. u2      abc  
  6. u2      efg  


前缀查找
Java代码   收藏代码
  1. [root@localhost ~]# tcbmgr list -pv -fm u1 user  
  2. u1      123  
  3. u1      456  
  4. u1      789  


范围查找
Java代码   收藏代码
  1. [root@localhost ~]# tcbmgr list -pv -rb u1 u2 user  
  2. u1      123  
  3. u1      456  
  4. u1      789  
  5. u2      abc  
  6. 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代码   收藏代码
  1. [root@localhost ttserver]# tctmgr create user  

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

删除记录
Java代码   收藏代码
  1. [root@localhost ttserver]# tctmgr out user 3  


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


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


通过其它字段查询
Java代码   收藏代码
  1. [root@localhost ttserver]# tctmgr search -pv user name STREQ "u1"  
  2. 1       name    u1      password        123  
  3. [root@localhost ttserver]# tctmgr search -pv user name STREQ "u1" password STREQ "123"  
  4. 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代码   收藏代码
  1. [root@localhost ttserver]# tctmgr search -pv -ord name STRDESC user  
  2. 9       name    u9      password        123456789  
  3. 3       name    u3      password        123456  
  4. 1       name    u1      password        123  
排序参数含义如下:
Java代码   收藏代码
  1. STRASC:按字符升序  
  2. STRDESC:按字符降序  
  3. NUMASC:按数字升序  
  4. NUMDESC:按字符降序  


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

索引类型
Java代码   收藏代码
  1. lexical:词汇  
  2. decimal:数字  
  3. token:不明白  
  4. qgram:不明白  
  5. void:不明白  


5.tctmgr
tctmgr支持的命令和参数
Java代码   收藏代码
  1. tctmgr create [-tl] [-td|-tb|-tt|-tx] path [bnum [apow [fpow]]]  
  2. 创建数据库  
  3. tctmgr inform [-nl|-nb] path  
  4. 输出数据库的状况  
  5. tctmgr put [-nl|-nb] [-sx] [-dk|-dc|-dai|-dad] path pkey [cols ...]  
  6. 创建记录  
  7. tctmgr out [-nl|-nb] [-sx] path pkey  
  8. 删除记录  
  9. tctmgr get [-nl|-nb] [-sx] [-px] [-pz] path pkey  
  10. 通过主键查询记录  
  11. tctmgr list [-nl|-nb] [-m num] [-pv] [-px] [-fm str] path  
  12. 输出所有记录  
  13. tctmgr search [-nl|-nb] [-ord name type] [-m num] [-sk num] [-kw] [-pv] [-px] [-ph] [-bt num] [-rm] [-ms type] path [name op expr ...]  
  14. 通过自定义条件查询记录  
  15. tctmgr optimize [-tl] [-td|-tb|-tt|-tx] [-tz] [-nl|-nb] [-df] path [bnum [apow [fpow]]]  
  16. 优化数据库  
  17. tctmgr setindex [-nl|-nb] [-it type] path name  
  18. 设置索引  
  19. tctmgr importtsv [-nl|-nb] [-sc] path [file]  
  20. Store records of TSV in each line of a file.  
  21. tctmgr version  
  22. Print the version information of Tokyo Cabinet.  

金山公司在Table Database的基础上,提供了SQL适配器,还整合了些方便使用的功能, TCSQL

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

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

这篇关于Tokyo Cabinet的四种数据结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786223

相关文章

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

IDEA实现回退提交的git代码(四种常见场景)

《IDEA实现回退提交的git代码(四种常见场景)》:本文主要介绍IDEA实现回退提交的git代码(四种常见场景),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.已提交commit,还未push到远端(Undo Commit)2.已提交commit并push到

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

查看MySQL数据库版本的四种方法

《查看MySQL数据库版本的四种方法》查看MySQL数据库的版本信息可以通过多种方法实现,包括使用命令行工具、SQL查询语句和图形化管理工具等,以下是详细的步骤和示例代码,需要的朋友可以参考下... 目录方法一:使用命令行工具1. 使用 mysql 命令示例:方法二:使用 mysqladmin 命令示例:方

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘