SquirrelMQ 一,SquirrelMQ使用二,使用客户端API三,使用Lua处理队列 快速的消息队列

程序名称:SquirrelMQ 一,SquirrelMQ使用二,使用客户端API三,使用Lua处理队列

授权协议: Apache

操作系统: Linux

开发语言: C/C++

SquirrelMQ 一,SquirrelMQ使用二,使用客户端API三,使用Lua处理队列 介绍

SquirrelMQ是一个快速的消息队列。

SquirrelMQ特性:

1. SquirrelMQ使用Slab内存分配算法来降低内存碎片,使用epoll来解决高并发问题。效率比redis要高,使用简单。

2. 另外SquirrelMQ支持持久化,在down机的情况下也不用担心数据丢失。

3. SquirrelMQ支持lua脚本,你可以制定自己的处理队列程序,只要在cron/main.lua中编写代码即可。

一,SquirrelMQ使用

下面,我们介绍使用SquirrelMQ消息队列来完成上面所说的应用吧。

1) 安装Lua。

2) 首先下载编译SquirrelMQ:

> wget <http://squirrel-message-queue.googlecode.com/files/squirrel-with-

lua-v1.2.zip>

> tar –zxvf squirrel-with-lua-v1.2.zip

> cd squirrel-with-lua-v1.2

> make

3) 修改SquirrelMQ配置(squirrel.conf文件):

侦听端口

listingPort 6061

最大可以使用内存数(单位:字节)

memoryLimitUsed 524288000

多长时间进行存储数据到硬盘(防止down机时数据丢失,单位为秒)

secondsToSaveDisk 30

多少次数据变化才进行存储数据到硬盘(防止写数据过于频繁)

chagesToSaveDisk 30

客户端连接多长时间不操作自动关闭(单位为秒)

clientExpiredTime 60

多长时间运行一次cron(单位为毫秒)

cronLoops 5000

是否开启Lua处理线程

enableLuaThread 1

是否使用守护进程模式运行

daemonize 0

我们根据自己的需求来修改配置,特别说明一下的是,当开启Lua处理线程时,我们可以编写Lua脚本来处理队列(在cron/main.lua)。这样就可以让服务器本身来处理消息队列的数据,而不用另外写一个cron程序来处理。下面我们会介绍。

4) 运行SquirrelMQ:

> ./squirrel –c squirrel.conf

二,使用客户端API

SquirrelMQ提供一个PHP访问的API,在php/squirrel.class.php。我们可以使用这个API文件轻松地访问SquirrelMQ。

这个API文件把所有访问SquirrelMQ的操作封装成一个类,叫Squirrel,在使用时直接new一个Squirrel的对象即可,如下:

<?php  
include("squirrel.class.php");  
$smq = new Squirrel('127.0.0.1', 6061);  
$smq->push_tail("INSERT INTO mytable(uid, username, password)VALUES(NULL, 'liexusong', '123456');");  
?>

这样,我们就可以把一条消息插入到消息队列了。我们可以使用size()方法来获取SquirrelMQ的消息条数:

<?php  
include("squirrel.class.php");  
$smq = new Squirrel('127.0.0.1', 6061);  
$size = $smq->size();  
echo "The SquirrelMQ size: $size";  
?>

SquirrelMQ支持的API有:

1)插入到队列的头部:

$smq->push_head($message);

2)插入到队列的尾部:

$smq->push_tail($message);

3)取得队列的第一条消息,并从队列中删除:

$message = $smq->pop_head();

4)取得队列的最后一条消息,并从队列中删除:

$message = $smq->pop_tail();

5)取得队列的第n条消息,并且从队列中删除:

$message = $smq->pop_index($index);

6)取得队列的第一条消息,但不从队列中删除:

$message = $smq->get_head();

7)取得队列的最后一条消息,但不从队列中删除:

$message = $smq->get_tail();

8)取得队列的第n条消息,但不从队列中删除:

$message = $smq->get_index($index);

9)取得队列的大小:

$size = $smq->size();

10)取得队列的状态:

$stat = $smq->stat();

三,使用Lua处理队列

SquirrelMQ的一个令人兴奋的特性就是支持使用Lua处理队列中的消息,下面我们来介绍一下这个功能。

要开启Lua处理线程,需要在配置文件中把enableLuaThread设置为1。这样SquirrelMQ就会开启Lua处理线程。我们可以在cron/main.lua文件中编写我们的Lua代码来处理队列中的消息。在cron/main.lua文件中,必须编写一个
main 的函数,SquirrelMQ就是以这个函数作为入口,如:

function __main__()  
......  
end

main
函数中,我们可以使用一些SquirrelMQ提供的API函数取得队列中的消息,如smq_pop_head()和smq_pop_tail()等。
main
函数可以这样写:

require "luasql.mysql"

function __main__()  
    env = luasql.mysql()  
    con = env:connect("database", "username", "password", "127.0.0.1", 3306)

    while true do  
       local ok, sql = smq_pop_head()  
       if ok then  
           res = con:execute(sql)  
       end  
    end

    con:close()  
    env:close()  
end

记住,SquirrelMQ提供的API都是阻塞的,也就是说,当队列为空时,API会阻塞知道队列有消息可以获取为止,这样做的目的是为了尽量减少Lua线程的运行时间。

在上面例子中,我们使用smq_pop_head()来取得队列的第一条消息,然后执行此消息(con:execute(sql))。

SquirrelMQ提供给Lua线程使用的API有:

ok, item = smq_pop_head()

ok, item = smq_pop_tail()

ok, item = smq_pop_index()

ok, item = smq_get_head()

ok, item = smq_get_tail()

ok, item = smq_get_index()

size = smq_queue_size()

ok = smq_push_head(item)

ok = smq_push_tail(item)

上面的API对应PHP客户端的API。

有问题可以联系我,新浪微薄:旭松_Lie

SquirrelMQ 一,SquirrelMQ使用二,使用客户端API三,使用Lua处理队列 官网

http://code.google.com/p/squirrel-message-queue/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


memcached-session-manager 将session存储到memchached实现方案时。他主要功能是修改tomcat的session存储机制,使之能够把session序列化存放到memcached中。
Tomcat Native 这个项目可以让 Tomcat 使用 Apache 的 apr 包来处理包括文件和网络IO操作,以提升性能。
EasyTomcat 是一个用来帮助简化 Tomcat 和MySQL 管理的系统,你可以启动、停止和配置 Tomcat和MySQL
riak-session-manager 是使用 Riak 来存储Tomcat session 信息的项目。 配置方法:
tomcat-redis-session-manager 是一个用来将 Tomcat 的 Session 数据存储在 Redis 库中的项目。
这是一款在 Oracle 的 JDeveloper 开发环境下管理Tomcat 的插件,如下图所示:
扩展Tomcat 6.x,使用redis存放session信息!是一个Eclipse项目,最好用EGit来Clone(因为里面有个中文文件名的说明文件).
dhcpcd 是一个兼容 RFC2131的DHCP客户端程序,支持DHCP的全部功能并且体积非常小,只有差不多 46k。
phpDHCPAdmin 是一个基于 Web 的动态主机配置协议(DHCP Daemon)的管理工具,可单独设置组、用户级别;PXE、多子网;空间租赁管理功能。可对数据进行可视化展示、分类。适合大规模的 dhcpd 环境管理。
JDHCP 项目的目的是为 Java 应用增加简单操作 DHCP 协议的方法,DHCP是动态主机配置协议的简称。使用这个API可以轻松的发送、接收和解析DHCP消息,可用于编写DHCP的客户端、服务器端应用。
DHCP服务器为客户端计算机分配IP地址,通常应用在企业网络中以减小配置成本,所有客户端的IP地址都保存在服务器端。
dhcp4java是一个用于操作DHCP信息包的纯Java类库。适用于DHCP服务器, DHCP客户端或DHCP转发。
dhcp-forwarder 是一个 DHCP 中继代理,它将在不同的子网广播域中转发 DHCP 广播信息。
不用看都知道是一个开源的 DHCP 服务器。 Open DHCP Server is a multi-subnet DHCP server. It supports both dynamic and
GAdmin-ProFTPD是一个基于GTK的可视化DHCP服务端管理工具。 更多的屏幕截图请看:http://mange.dynalias.org/linux/gadmin-dhcpd/screenshots/
Dual DHCP DNS Server 是一个提供 DHCP 和 DNS 服务的服务器软件,每一个功能都可以单独启用或者关闭。
Dhcpy6d 是一个开源的 DHCPv6 的服务器软件,相当于为 IPv6 客户端提供 DHCP 协议。
DHCP as a filesystem,要求 FUSE 的支持,使用 Go 语言开发。 安装: GOFUSE=github.com/hanwen/go-fuse
简易图床支持 HDFS 本地存储远端存储等。 Status Esay Graph bed Use HDFS Use Qiniu Use upyun Use Local
一个使用python开发的简单好用的 PXE (DHCP/TFTP/HTTP) 服务器,同时支持netboot、dhcp-