博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tokyo Tyrant基本规范(4)--协议
阅读量:6838 次
发布时间:2019-06-26

本文共 2435 字,大约阅读时间需要 8 分钟。

    本节介绍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 valueend

 

七. 协议

    服务器和客户端的协议是基于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"格式表示。

转载地址:http://svwul.baihongyu.com/

你可能感兴趣的文章
Asp.net core 学习笔记 ( Web Api )
查看>>
构造函数(包含this关键字的简单应用)
查看>>
最烦人的正则表达式记忆口诀
查看>>
leetcode Merge Two Sorted Lists
查看>>
[oracle]常用SQL汇总
查看>>
Struts2_day04--课程介绍_Struts2拦截器概述&底层原理_重要的概念
查看>>
我的Java设计模式-工厂方法模式
查看>>
添加支付宝支付按钮,实现捐赠本站
查看>>
SqlDataReader生成动态Lambda表达式
查看>>
leetcode897
查看>>
莫比乌斯函数+莫比乌斯反演
查看>>
90%的用户都不知道手机内部功能
查看>>
CSU 1325: A very hard problem 中南月赛的一道题。
查看>>
设置串行端口的通信参数
查看>>
JPA基础(二)(转)
查看>>
js获取当前浏览器地址栏的链接,然后在链接后面加参数
查看>>
设为首页 收藏(IE可用)
查看>>
Cesium 创建Geometry
查看>>
OpenGL的几何变换4之内观察全景图
查看>>
@RenderBody、@RenderSection、@RenderPage、Html.RenderPartial、Html.RenderAction的作用和区别...
查看>>