下载地址:
http://fallabs.com/tokyotyrant/
http://fallabs.com/tokyocabinet/
内存数据库,顾名思义,就是所有的数据都放到内存里面, 加快查询速度。
内存数据库有哪些 :
1. Mysql 有内存表的概念,创建表时, ENGINE=MEMORY 就会创建一个内存数据表。
2. SQLite3 也支持内存数据库模式。
3. TTServer 日本人开发的 Key -Value模式的内存数据库
4. Redis 也是一个Key - Value 模式的内存数据库 http://www.redisbook.com/en/latest/
当然了, SQL Server, Oracle 也和Mysql 一样可以创建内存数据库。 我们这里就不介绍 SQL Server 和 Oracle 了。
Mysql 和 SQLite3 都是属于关系型的数据库, 并且支持用sql语言进行数据的检索。
TTServer 和 Redis 属于Key-Value模式的内存数据库, 无法用sql语言来查询,其本质就是一个hash算法。
Redis 和其他很多 key-value 数据库的不同之处在于,Redis 不仅支持简单的字符串键值对,它还提供了一系列数据结构类型值,比如列表、哈希、集合和有序集,并在这些数据结构类型上定义了一套强大的 API 。通过对不同类型的值进行操作,Redis 可以很轻易地完成其他只支持字符串键值对的 key-value 数据库很难(或者无法)完成的任务。在 Redis 的内部,数据结构类型值由高效的数据结构和算法进行支持,并且在 Redis 自身的构建当中,也大量用到了这些数据结构。
到底选择哪种类型的内存数据库,就看我们的需求了, 如果就功能的复杂度而言, Redis支持的存储数据结构类型比TTServer丰富多了,其Value可能是一个链表,可能是一个hashMap的数组, 都可以存放。 但是TTServer 的Value就是一个内存块, 具体是什么格式, 需要应用层自己管理。
我们平常所说的 TTServer 其实包括两个部分的源码 tokyoCabinet-1.4.48.tar.gz 和 tokyoTyrant-1.1.41.tar.gz 。
tokyoCabinet-1.4.48.tar.gz 只实现了TCADB TCBDB TCHDB TCFDB 四种数据库的算法。你可以在自己的应用程序中直接使用这几种类型的内存数据库。
tokyoTyrant-1.1.41.tar.gz 是为了实现客户端机器和数据库服务器不在同一台物理机的情况下,需要通过Socket 网络访问数据库的情况下而实现的一个网络协议接口。
该接口就是TCRDB。
在ttserver.c的proc函数里有下面的代码:
TCADB *adb = tcadbnew();
if(skellib)
{
void *initsym = dlsym(skellib, "initialize");
if(initsym)
{
bool (*initfunc)(ADBSKEL *);
memcpy(&initfunc, &initsym, sizeof(initsym));
if(initfunc(&skel))
{
if(!tcadbsetskel(adb, &skel))
{
if(skel.opq && skel.del) skel.del(skel.opq);
err = true;
ttservlog(g_serv, TTLOGERROR, "tcadbsetskel failed");
}
}
else
{
if(skel.opq && skel.del) skel.del(skel.opq);
err = true;
ttservlog(g_serv, TTLOGERROR, "initialize failed");
}
}
else
{
err = true;
ttservlog(g_serv, TTLOGERROR, "dlsym failed: %s", dlerror());
}
}
xxx.so 里需要实现函数自定义的open , close , put, get, del 等函数, 这样当ttserver收到put,get命令时, 就会调用自定义的put和get了。
加载方式就是通过下面的函数指针的方式进行挂载的。
bool initialize(ADBSKEL *skel)
{
skel->opq = tcddbnew();
skel->del = (void (*)(void *))tcddbdel;
skel->open = (bool (*)(void *, const char *))tcddbopen;
skel->close = (bool (*)(void *))tcddbclose;
skel->put = (bool (*)(void *, const void *, int, const void *, int))tcddbput;
skel->out = (bool (*)(void *, const void *, int))tcddbout;
skel->get = (void *(*)(void *, const void *, int, int *))tcddbget;
return true;
}
ttserver 的缺点, 就是一个ttserver进程只能有一个数据表, 我们可以修改ttserver的通信协议,让其支持多个内存数据表。
我们可以在通信协议里增加一个字节的 idx 来标示我们要操作的数据表的ID,这样一个ttserver进程就可以管理多大255个数据表了。