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"格式表示。