SquirrelMQ消息队列
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
# 是否需要密码认证
enableAuth 0
# 认证密码(在enableAuth为1时才需要)
authPwd xn2k@*%bse!@
# lua脚本的路径
luaFilePath /var/squirrelmq/main.lua
# 提供给SquirrelMQ调用的函数
luaMainFunction __main__
# 是否使用守护进程模式运行
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的对象即可,如下:
1
2
3
4
5
|
<?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函数可以这样写:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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。
SquirrelMQ消息队列的更多相关文章
- Redis实现简单的消息队列
1.问:什么是消息队列? 答:是一个消息的链表,是一个异步处理的数据处理引擎. 2.问:有什么好处? 答:不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失. 3.问:用途有哪些? 答:邮件 ...
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- 消息队列 Kafka 的基本知识及 .NET Core 客户端
前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...
- .net 分布式架构之业务消息队列
开源QQ群: .net 开源基础服务 238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...
- 【原创经验分享】WCF之消息队列
最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...
- Java消息队列--ActiveMq 实战
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- Java消息队列--JMS概述
1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...
随机推荐
- Tomcat学习笔记 - 错误日志 - NetBeans配置tomcat出错情况总结 -- 部署错误: 启动 Tomcat 失败。-- '127.0.0.1' 不是内部或外部命令,也不是可运行的程序
真的管用,不知道为啥管用.转载自:http://blog.sina.com.cn/s/blog_709548200102vgy4.html 问题描述: 新安装的NetBeans8.0.2,安装过程中还 ...
- Windows7上FTP服务器建立
1. FTP服务器建立 注意:千万不能使用FTP和ftp建立用户,否则无法登陆ftp服务器. 1.1本地机器上创建一个用户 这个用户是用来登录到FTP的.我的电脑右键->管理->本地用户和 ...
- 使导出excle文档实现ALT+Enter的效果()
JAVA中输入什么转义字符,使导出excle文档实现ALT+Enter的效果?或者有没有其他方法可以实现. 20 JAVA中输入什么转义字符,使导出excle文档实现ALT+Enter的效果?或者有没 ...
- 70道android面试题汇总
1. 下列哪些语句关于内存回收的说明是正确的? (b ) A. 程序员必须创建一个线程来释放内存 B. 内存回收程序负责释放无用内存 C. 内存回收程序允许程序员直接释放内存 D. 内存回收程序可以在 ...
- Resharper使用
Resharper进阶一:简要介绍 官方下载地址下载地址 注册码: 用户名: User 注册码:D9d09DSYJel9IyuDU4btAQwZcbLugUad 面对这样一个问题:为什么.net能够 ...
- javacc
http://www.cnblogs.com/Gavin_Liu/archive/2009/03/07/1405029.html https://javacc.java.net/ http://www ...
- How To Compile Qt with Visual Studio 2010
This post is a step-by-step guide on how to compile Qt 4.x.x with MSVC 2010. Although we use Qt 4.7. ...
- You don't seem to have 'make' or 'gmake' in your PATH
标题尚的错误,不是原因,因为which make的时候是有显示/usr/bin/make的,echo $PATH的时候也是有make的路径的. 编译Qt ./configure的时候出现标题上错误, ...
- C# ADO基础 SqlHelper
class SqlHelper { //这个是将连接数据库的字符串写到配置文件中的 private static string connStr = ConfigurationManager.Conne ...
- 瑞柏匡丞:国内外App市场分析报告
互联网不可阻挡的向移动互联网转化.对于各种新兴产业来讲,移动APP是当下行业的颠覆者,也是未来的王者.国内外app市场的火热程度都已经远远超出了人们的预想,然而国内外市场的区别还是相当明显的. 首先, ...