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消息队列的更多相关文章

  1. Redis实现简单的消息队列

    1.问:什么是消息队列?  答:是一个消息的链表,是一个异步处理的数据处理引擎. 2.问:有什么好处? 答:不仅能够提高系统的负荷,还能够改善因网络阻塞导致的数据缺失. 3.问:用途有哪些? 答:邮件 ...

  2. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  3. 消息队列 Kafka 的基本知识及 .NET Core 客户端

    前言 最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧. 本篇不谈论 Kafka 和其他的一些消息 ...

  4. .net 分布式架构之业务消息队列

    开源QQ群: .net 开源基础服务  238543768 开源地址: http://git.oschina.net/chejiangyi/Dyd.BusinessMQ ## 业务消息队列 ##业务消 ...

  5. 【原创经验分享】WCF之消息队列

    最近都在鼓捣这个WCF,因为看到说WCF比WebService功能要强大许多,另外也看了一些公司的招聘信息,貌似一些中.高级的程序员招聘,都有提及到WCF这一块,所以,自己也关心关心一下,虽然目前工作 ...

  6. Java消息队列--ActiveMq 实战

    1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...

  7. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  8. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  9. Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇

    目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...

随机推荐

  1. Tomcat学习笔记 - 错误日志 - Tomcat部署项目或修改xml配置出现无法保存的情况(拒绝访问)

    原因分析:(windows下) 可能有人会发现在编辑好 tomcat-users.xml 文件后无法保存,原因是使用的用户没有权限修改文件,可能是把 Tomcat 发行包放到了一个需要管理员权限才能修 ...

  2. py函数递归

    1.从前有座山,山中有座庙,庙里有一个老和尚在讲故事... 2.递归:程序调用自身. 3.形式:在函数定义有直接或间接调用自身. 例如:阶乘: n!= 1 x 2 x 3 x ... x n; 从后身 ...

  3. FatMouse's Speed(HDU LIS)

    FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. x位全排列(next_permutation)

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  5. class A<T>where T

    where表明了对类型变量T的约束关系.where T: A表示类型变量是继承于A的,或者是A本身.where T:new()指明了创建T的实例时应该使用的构造函数.

  6. USB系列之六:基于DOSUSB的简单U盘驱动程序

    首先要说明的是,该驱动程序仅实现了部分块设备的功能,如果作为成品软件使用,会感觉性能比较差,而且有些功能(比如FORMAT)是不能完成的,发表此驱动程序的目的旨在说明USB的编程原理以及DOS下驱动程 ...

  7. Linux系统编程(11)——进程间通信之有名管道

    管道应用的一个重大限制是它没有名字,因此,只能用于具有亲缘关系的进程间通信,在有名管道(named pipe或FIFO)提出后,该限制得到了克服.FIFO不同于管道之处在于它提供一个路径名与之关联,以 ...

  8. 经验:Ubuntu 登陆 L2TP VPN

    Ubuntu Linux 操作系统默认支持PPTP协议的VPN登陆,但是随着网络环境的复杂化,我们需要使用L2TP协议的VPN登陆,下面,我们只需要简单的几条命令即可登陆L2TP协议的VPN.     ...

  9. 剑指offer-面试题2.实例Singleton模式

    题目:设计一个类,我们只能生成该类的一个实例 这道题显然是对设计模式的考察,很明显是单例模式.什么是单例模式呢,就是就像题目所说的只能生成一 个类的实例.那么我们不难考虑到下面几点: 1.不能new多 ...

  10. Zookeeper 5、Zookeeper应用场景

    应用场景1 .统一命名服务 » 分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住,通常情况 下用树形的名称结构是一个理想的选择,树形的名称结构是一个有层次的目录结构, ...