Tokyo Cabinet 安装和使用 .

来源:互联网 发布:淘宝3大组装电脑卖家 编辑:程序博客网 时间:2024/06/06 03:42

http://blog.csdn.net/ganzi_yy/article/details/5370345

一、安装
1、首先编译安装tokyocabinet数据库
编译的时候会提示找不到zlib.h和bzlib.h,那么先安装zlib-devel和bzip2-devel这两个包分别有这两个头文件
rpm -ivh zlib-devel-1.2.3-3.i386.rpm
rpm -ivh bzip2-devel-1.0.3-4.el5_2.i386.rpm
wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.41.tar.gz
tar zxvf tokyocabinet-1.4.41.tar.gz
cd tokyocabinet-1.4.41/
./configure --enable-off64 #启动64位偏移,因为我机器是32位,如果数据库文件超过2G,不加此参数ttserver会崩溃
make
make install
cd ../
2、然后编译安装tokyotyrant
wget http://1978th.net/tokyotyrant/tokyotyrant-1.1.39.tar.gz
tar zxvf tokyotyrant-1.1.39.tar.gz
cd tokyotyrant-1.1.39/
./configure
make
make install
cd ../
二、配置
1、创建Tokyo Tyrant数据文件存放目录
mkdir -p /ttserver/
2、启动Tokyo Tyrant主进程
1)单机模式
ulimit -SHn 51200
ttserver -host 127.0.0.1 -port 11111 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 1 -rts /ttserver/ttserver.rts /ttserver/database.tch
2)互为主辅
注:数据库类型由后缀决定,因为我只需要key-value的功能,所以采用功能简单,速度快的hash database
Hash Database :.tch
B+ tree database :.tcb
fixed-length database :.tcf
table database :.tct
内存Hash Database :*
内存B+ tree database :+
服务器 192.168.1.110
ulimit -SHn 51200
ttserver -host 192.168.1.110 -port 11111 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 110 -mhost 192.168.1.92 -mport 11111 -rts /ttserver/ttserver.rts /ttserver/database.tch
服务器 192.168.99.111
ulimit -SHn 51200
ttserver -host 192.168.1.111 -port 11111 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 111 -mhost 192.168.1.91 -mport 11111 -rts /ttserver/ttserver.rts /ttserver/database.tch
3)参数说明
ttserver [-host name] [-port num] [-thnum num] [-tout num] [-dmn] [-pid path] [-log path] [-ld|-le] [-ulog path] [-ulim num] [-uas] [-sid num] [-mhost name] [-mport num] [-rts path] [dbname]
  -host name : 指定需要绑定的服务器域名或IP地址。默认绑定这台服务器上的所有IP地址。
  -port num : 指定需要绑定的端口号。默认端口号为1978
  -thnum num : 指定线程数。默认为8个线程。
  -tout num : 指定每个会话的超时时间(单位为秒)。默认永不超时。
  -dmn : 以守护进程方式运行。
  -pid path : 输出进程ID到指定文件(这里指定文件名)。
  -log path : 输出日志信息到指定文件(这里指定文件名)。
  -ld : 在日志文件中还记录DEBUG调试信息。
  -le : 在日志文件中仅记录错误信息。
  -ulog path : 指定同步日志文件存放路径(这里指定目录名)。
  -ulim num : 指定每个同步日志文件的大小(例如128m)。
  -uas : 使用异步IO记录更新日志(使用此项会减少磁盘IO消耗,但是数据会先放在内存中,不会立即写入磁盘,如果重启服务器或ttserver进程被kill掉,将导致部分数据丢失。一般情况下不建议使用)。
  -sid num : 指定服务器ID号(当使用主辅模式时,每台ttserver需要不同的ID号)
  -mhost name : 指定主辅同步模式下,主服务器的域名或IP地址。
  -mport num : 指定主辅同步模式下,主服务器的端口号。
  -rts path : 指定用来存放同步时间戳的文件名。
3、停止ttserver进程
ps aux | grep ttserver | grep -v 'grep' | awk -F ' ' '{print $2}' | xargs kill -TERM

 

启动ttserver查看端口是否开放,如果端口没有开放,需要关闭防火墙。


三、调用
1、使用memcached兼容协议
2、http调用
写 curl -X PUT http://127.0.0.1:11111/key -d "value"
读 curl http://127.0.0.1:11111/key
删 curl -X DELETE http://127.0.0.1:11111/key
3、使用C调用
1)直接写文件
例:
我使用的是hash database 所有函数带tch前缀,如果是其他数据库请参考tokyocabinet-1.4.31/doc下spex-en.html的函数接口说明

#include <tcutil.h>

#include <tchdb.h>

#include <stdlib.h>

#include <stdbool.h>

#include <stdint.h>

 

int main(int argc, char **argv)

{

TCHDB *hdb;int ecode;char *key, *value;

 

/* create the object */

hdb = tchdbnew();

 

/* open the database */

if(!tchdbopen(hdb, "casket.tch", HDBOWRITER | HDBOCREAT))

{        ecode = tchdbecode(hdb);        fprintf(stderr, "open error: %s/n", tchdberrmsg(ecode));}

 

/* store records */

if(!tchdbput2(hdb, "foo", "hop") ||!tchdbput2(hdb, "bar", "step") ||!tchdbput2(hdb, "baz", "jump"))

{        ecode = tchdbecode(hdb);        fprintf(stderr, "put error: %s/n", tchdberrmsg(ecode));}

 

/* retrieve records */

value = tchdbget2(hdb, "foo");

if(value)

{        printf("%s/n", value);        free(value);}

else

{        ecode = tchdbecode(hdb);        fprintf(stderr, "get error: %s/n", tchdberrmsg(ecode));}

 

/* traverse records */

tchdbiterinit(hdb);

 

while((key = tchdbiternext2(hdb)) != NULL)

{        value = tchdbget2(hdb, key);        if(value){                printf("%s:%s/n", key, value);        free(value);}        

          free(key);

}

 

/* close the database */

if(!tchdbclose(hdb))

{        ecode = tchdbecode(hdb);        fprintf(stderr, "close error: %s/n", tchdberrmsg(ecode));}

/* delete the object */

tchdbdel(hdb);return 0;}

 

 

2)使用网络读写例:
请参考tokyotyrant-1.1.33/doc下index.html的函数接口说明
#include <tcrdb.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>
int main(int argc, char **argv){
TCRDB *rdb;
int ecode;
char *value;
/* create the object */
rdb = tcrdbnew();
/* connect to the server */
if(!tcrdbopen(rdb, "localhost", 1978)){
        ecode = tcrdbecode(rdb);
        fprintf(stderr, "open error: %s/n", tcrdberrmsg(ecode));
}
/* store records */
if(!tcrdbput2(rdb, "foo", "hop") ||
!tcrdbput2(rdb, "bar", "step") ||
!tcrdbput2(rdb, "baz", "jump")){
        ecode = tcrdbecode(rdb);
        fprintf(stderr, "put error: %s/n", tcrdberrmsg(ecode));
}
/* retrieve records */
value = tcrdbget2(rdb, "foo");
if(value){
        printf("%s/n", value);
        free(value);
} else {
        ecode = tcrdbecode(rdb);
        fprintf(stderr, "get error: %s/n", tcrdberrmsg(ecode));
}
/* close the connection */
if(!tcrdbclose(rdb)){
        ecode = tcrdbecode(rdb);
        fprintf(stderr, "close error: %s/n", tcrdberrmsg(ecode));
}
/* delete the object */
tcrdbdel(rdb);
return 0;
}

 

 

编译C程序命令:

gcc -I/usr/local/include tt_example.c -o tt_example -L/usr/local/lib -ltokyotyrant -ltokyocabinet -lz -lbz2 /

    -lresolv -lnsl -ldl -lrt -lpthread -lm -lc