Sky's blog

我和我追逐的梦

常用链接

统计

其他链接

友情链接

最新评论

Tokyo Tyrant基本规范(4)--协议


    Tokyo Tyrant基本规范,翻译自Tokyo Tyrant官网。

    本节介绍Tokyo Tyrant的远程数据库API,Lua扩展和协议。部分细节内容没有翻译。

五. 远程数据库API


    远程数据库是一组用于使用Tokyo Cabinet抽象数据库的接口,由Tokyo Tyrant服务器作为中介。查看'tcrdb.h'获取全部说明。

    注:该API是以.h文件提供,适用于C语言。对java开发似乎意义不大,因此考虑跳过此章节。

六. Lua 扩展

    数据库服务器可以在启动时读取通过'-ext'选项指定的Lua脚本文件。客户端可以通过远程数据库API的'tcrdbext'函数来调用定义在脚本文件中的函数。

1) 用户自定义函数

    可以在脚本文件中定义一些任意的函数。每个函数接收2个字符串参数(key和value)。返回值将被发送回客户端。如果函数返回'nil',服务器发送错误码到客户端。

    'tcrdbext'提供两种类型的加锁操作。一种是全局锁定,意味着同一时刻仅有一个线程能操作这个函数。另外一种是记录锁定,意味着同一时刻仅有一个线程能操作这个指定key的记录。

    注意Lua解释器的实例被每个原生线程分别处理。因为Lua的全局变量无益于在远程线程或者会话中共享数据,需要使用数据库或者stash functions来共享数据。

Built-in Functions

2) 内建函数

    下列用于数据库操作的内建函数可以在用户自定义函数中使用。'key'和'value'参数的类型可以是string或者number。如果给出number,将被转换为十进制字符串。

    注: 详细的内建函数列表就不一一翻译了,请参考原文。

    *****************************

    内建函数,名称以'_'开头,不能被客户端直接调用。当服务器启动时,如果有定义函数'_begin'则该函数被隐式的调用。当服务器停止时,如果有定义函数'_end'则该函数被隐式的调用。


    以下为内建的全局变量:

全局变量 信息
'_version' 服务器的版本信息
'_pid' 进程ID
'_sid' 服务器ID
'_thnum' 原生线程的数目
'_thid' 每个原生线程的ID数字


3) 实例代码

    下面的代码是增加记录的值并存储为十进制数字的字符串的例子。这个函数可以在调用时使用记录锁定来保证原子性。

function incr(key, value)
   value = tonumber(value)
   if not value then
      return nil
   end
   local old = tonumber(_get(key))
   if old then
      value = value + old
   end
   if not _put(key, value) then
      return nil
   end
   return value
end


七. 协议

    服务器和客户端的协议是基于TCP/IP。默认,服务端口被绑定在本机的每个地址上,端口号位1978。每个服务器和客户端的会话由request和response组成。服务器在同一端口上使用三种协议。

1) 原始二进制协议

    在原始二进制协议中,请求被分类为下列命令。请求和应答的结构由命令决定。请求和应答的整型字节码顺序是big endian。

    注: 详细的二进制协议命令就不一一翻译了,请参考原文。

    *****************************

    客户端可以在任意时间结束和关闭socket来结束会话。如果不关闭,则连接可以被下一次会话重用。如果发生违反协议或者某些知名错误,服务器会立即终止会话并关闭连接。


2) Memcached 兼容协议

    作为memcached (ASCII)兼容协议,服务器实现下列命令: "set", "add", "replace", "get", "delete", "incr", "decr", "stats", "flush_all", "version" 和 "quit". 更新命令的"norely"选项同样支持。但是, "flags", 

"exptime" 和 "cas unique" 参数将被忽略。

3) HTTP 兼容协议
    作为HTTP (1.1) 兼容协议, 服务器实现下列命令:

命令 类似于

"GET" 'tcrdbget'
"HEAD" 'tcrdbvsiz'
"PUT" 'tcrdbput'
"POST" 'tcrdbext'
"DELETE" 'tcrdbout'
"OPTIONS" 'tcrdbstat'

    每个请求的URI将被作为URL编码过的key对待。而实体内容被作为value。不过,除"Connection"和"Content-Length"外所有的header被忽略。

    "PUT"有header "X-TT-PDMODE",值可以是1(同'tcrdbputkeep'), 2(同'tcrdbputcat'), 或者其他(同'tcrdbput')。

    "POST"可以有header "X-TT-XNAME" 或 header "X-TT-MNAME"中的一个."X-TT-XNAME"等同于'tcrdbext',用于指定函数名。header "X-TT-XOPTS" 用于 bitwise-or 选项,1(记录锁)和2(全局锁). 每个请求的URI将被作为URL编码过

的key对待。而实体内容被作为value。结果表示在应答的实体正文中。header"X-TT-MOPTS"用于 bitwise-or 选项 , 1(忽略更新日志)。 请求参数用"application/x-www-form-urlencoded"格式表示在实体正文中。名字被忽略而值被作

为参数列表。结果在应答的实体正文中用"application/x-www-form-urlencoded"格式表示。





posted on 2010-08-19 15:38 sky ao 阅读(1503) 评论(0)  编辑  收藏 所属分类: nosql


只有注册用户登录后才能发表评论。


网站导航: