小日本的内存数据库TTServer(tokyoCabinet,tokyoTyrant) 分析

下载地址:

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());
    }
  }

TTServer可以加载自定义的动态库,通过运行参数指定  -skel  xxx.so  的方式加载  xxx.so  我们可以在xxx.so里实现自定义类型的数据的加载。

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个数据表了。








你可能感兴趣的:(小日本的内存数据库TTServer(tokyoCabinet,tokyoTyrant) 分析)