Tokyo Tyrant最常用的功能就是提供key->value的数据存储服务,再加上Tokyo Tyrant的lua语言扩展就可以实现很多适合自己需求的功能,例如:定时清理缓存数据(ttserver本身并不去管数据的过期时间,当然它采用的是磁盘存储,可以有很大的空间用来存放数据,不必去管数据的过期);session服务器;队列服务器;记数器等等!
下面就来说一说,如何用Tokyo Tyrant构建一个队列服务器:
1. 安装
wget http : // 1978th.net/tokyocabinet/tokyocabinet-1.4.45.tar.gz
tar zxvf tokyocabinet - 1.4 . 45 . tar . gz
cd tokyocabinet - 1.4 . 45
./ configure -- enable - off64
# 32位系统需要 --enable-off64,以让它支持大于2GB的文件
make
make install
cd ../
# ttserver运行时,支持一些扩展脚本,这里采用lua脚本,所以需要lua的支持,安装 lua
wget http : // www.lua.org/ftp/lua-5.1.4.tar.gz
tar zxvf lua - 5.1 . 4 . tar . gz
cd lua - 5.1 . 4 . tar . gz
# 要根据系统而定,直接make它会有提示
make linux
make install
ln - s / usr / local / bin / lua / usr / bin / lua
cd ../
# 安装Tokyo Cabinet 的 lua 扩展
wget http : // 1978th.net/tokyocabinet/luapkg/tokyocabinet-lua-1.9.tar.gz
tar zxvf tokyocabinet - lua - 1.9 . tar . gz
cd tkoyocabinet - lua - 1.9 . tar . gz
./ configure
make
make install
cd ../
// 安装 Tokyo Tyrant
wget http : // 1978th.net/tokyotyrant/tokyotyrant-1.1.40.tar.gz
tar zxvf tokyotyrant - 1.1 . 40 . tar . gz
./ configure -- enable - lua -- with - lua
make
make install
cd ../
2. 配置
在 tokyo tyrant 的源码目录下有一个 ext 文件夹,里面存放的就是一些 lua 扩展脚本,queue.lua 就是用来提供队列服务的,这里我将 queue.lua 复制到 /etc/ttserver 里面去,打开该脚本,里面提供三个函数,主要是:
enqueue(key, value),进队列,key为队列名称,value为队列值。
dequeue(key, max),出队列,key为队列名称,max为每次从队列中取出多少条记录。
queuesize(key),队列的长度,key为队列名称。
3. 启动
/ data / ttserver / my_queue / ttserver . log - le - ulog / data / ttserver / my_queue / - ulim 32m - sid 1 - rts
/ data / ttserver / my_queue / ttserver . rts - ext / etc / ttserver / queue . lua
/ data / ttserver / my_queue / database . tch
启动参数说明可以参考这里:http://blog.s135.com/post/362/
4. 测试
向队列服务器里插入一条记录,my_queue为队列名,hello是记录值。如果插入成功就会返回:ok
从队列服务器里取出一条记录,my_queue为队列名,1为只取一条记录。返回队列头部的第一条记录值。
5. 客户端访问
一般在web中有很多需要用到队列的地方,刚好,演示一下如何用tokyo tyrant为PHP提供队列服务。
我这里用到的是PHP版本的 tokyo tyrant 客户端,如果想用so版本的,就需要去 http://pecl.php.net/package/tokyo_tyrant 下载后编译安装,这里我以 php 版的客户端测试。
循环向队列写入100条记录,并一次取出10条记录,代码如下:
include ( ' Tyrant/Tyrant.php ' );
$tt = Tyrant :: connect( ' 127.0.0.1 ' , ' 11221 ' );
for ( $i = 1 ; $i <= 100 ; $i ++ )
{
$tt -> ext( ' enqueue ' , ' my_queue ' , $i , 0 );
}
var_dump ( $tt -> ext( ' dequeue ' , ' my_queue ' , 10 , 0 ));
// 上面ext方法的最后一个参数0,为是否开启锁机制,还有下面两个值可选:
//一个相当于行锁,一个相当于表锁,一般第一个就够用了
//Tyrant::XOLCKREC for record locking
//Tyrant::XOLCKGLB for global locking
?>
运行结果:
返回的值是一个字符串,每条记录之间用"\n"分隔,最后也有一个"\n"。
接着再通过 tcrmgr 去队列中取出10条记录:
队列服务器搭建完毕,以ttserver一直以来的表现,效率方面应该不是问题,这里我也没有进行大量的这方面的测试。