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

前端之家收集整理的这篇文章主要介绍了Tokyo Tyrant基本规范(4)--协议前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

本节介绍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) 实例代码

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

functionincr(key,value)
value=tonumber(value)
ifnotvaluethen
returnnil
end
localold=tonumber(_get(key))
ifoldthen
value=value+old
end
ifnot_put(key,value)then
returnnil
end
returnvalue
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"格式表示。

猜你在找的NoSQL相关文章