SquirrelMQ

快速的消息队列
授权协议 Apache
开发语言 C/C++
所属分类 服务器软件、 JMS/消息中间件
软件类型 开源软件
地区 不详
投 递 者 樊琦
操作系统 Linux
开源组织
适用人群 未知
 软件概览

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

  • 作者:LAMP小白  点击:1489  发布日期:2012-09-20 00:56:00  返回列表 一,SquirrelMQ使用 下面,我们介绍使用SquirrelMQ消息队列来完成上面所说的应用吧。 1) 安装Lua。 2) 首先下载编译SquirrelMQ: #> tar –zxvf squirrel-with-lua-v1.2.zip #> cd squirrel-with-lua-v1.

  • SquirrelMQ特性: 1. SquirrelMQ使用Slab内存分配算法来降低内存碎片,使用epoll来解决高并发问题。效率比redis要高,使用简单。 2. 另外SquirrelMQ支持持久化,在down机的情况下也不用担心数据丢失。 3. SquirrelMQ支持lua脚本,你可以制定自己的处理队列程序,只要在cron/main.lua中编写代码即可。   一,SquirrelMQ使用

  • 代码量不算多,非常适合学习(socket,poll,memory方面都不错) SquirrelMQ是一个快速的消息队列。 SquirrelMQ特性: 1. SquirrelMQ使用Slab内存分配算法来降低内存碎片,使用epoll来解决高并发问题。效率比redis要高,使用简单。 2. 另外SquirrelMQ支持持久化,在down机的情况下也不用担心数据丢失。 3. SquirrelMQ支持lu

  • 原文:http://blog.sina.com.cn/s/blog_7530db6f0100uo4c.html     我们知道微博的访问量是非常大的,一秒钟可能有成千上万的人发布微博或者删除微博,所以数据库要承受的压力非常大,这样就可能导致数据库并发量太大而操作失败。     那么,我们考虑一下,可不可以把所有的插入操作一步一步的完成呢?也就是说等到第一个插入操作完成再做第二个插入操作呢?要实现

 相关资料
  • Flask 提供了消息闪现的功能,以使我们的应用可以向用户反馈信息。比如,当用户登录失败了,我们会提醒用户名错误或者密码错误。 在 Flask 中使用消息闪现很简单。下面我们以上一篇的例子进行说明。完整的代码在这里。 首先,让我们看一下book.py的代码: # -*- coding: utf-8 -*- from flask import Blueprint, url_for, render_t

  • 问题内容: 我正在寻找Java 的快速实现。我看到实现了该接口,但是它只会和正确的一样快吗?有没有办法有一个队列会更快尤其是对(我只需要,并检查)。我可能还需要一个,但现在还不需要。 问题答案: 我看到LinkedList实现了Queue接口,但是它只会和LinkedList一样快吗? 盯着源代码,对于Queue.add,Queue.poll和Queue.peek操作,LinkedList为O(1

  • 为什么已经拥有了共享内存时需要消息队列呢? 这将是多种原因,让我们将其分解为多个点来简化 - 据了解,一旦消息被一个进程接收到,它将不再可用于任何其他进程。 而在共享内存中,数据可供多个进程访问。 如果想使用小信息格式进行通信。 当多个进程同时进行通信时,共享内存数据需要同步保护。 使用共享内存的写入和读取频率很高,那么实现功能将会非常复杂。 在这种情况下不值得使用。 如果所有的进程不需要访问共享

  • 一、消息模型 点对点 发布/订阅 二、使用场景 异步处理 流量削锋 应用解耦 三、可靠性 发送端的可靠性 接收端的可靠性 参考资料 一、消息模型 点对点 消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅 消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同: 观察者模式中,观察者和主题都知道对方的存在;

  • 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: *

  • 消息队列接口 结构体 struct   rt_messagequeue   消息队列控制块 更多...   类型定义 typedef struct rt_messagequeue *  rt_mq_t   消息队列类型指针定义   函数 rt_err_t  rt_mq_init (rt_mq_t mq, const char *name, void *msgpool, rt_size_t msg_