G MEMCACHEQ AS MESSAGE QUEUE

PHP,消息队列,MEMCACHEQ

使用消息队列(MESSAGE QUEUE)可以把某些耗时的工作推后,然后在后台慢慢地去执行,
这样就不会让你的用户等待太久。

今天介绍PHP的消息队列: MEMCACHEQ。

MEMCACHEQ

MEMCACHEQ的特性:
1 简单易用
2 处理速度快
3 多条队列
4 并发性能好
5 与memcache的协议兼容。这就意味着只要装了memcache的extension就可以了,不需要额外的插件。
6 在zend framework中使用也很方便。

MEMCACHEQ依赖于libevent和BerkleyDB。
BerkleyDB用于持久化存储队列的数据。 这样在MEMCACHEQ崩溃或者服务器挂掉的时候,
不至于造成数据的丢失。这一点很重要,很重要。

MemcacheQ will run as a daemon and communicates over the UDP protocol. It can handle concurrent connections and can be used in a load-balanced environment.

启动参数:

memcacheq -d -r -H /data/memcacheq -N -R -v -L 1024 -u nobody &> \
/data/memcacheq/error.log
解释一下:
-d 守护进程
-r Maximize core file limit
-v 详细输出
-u 以用户的身份来运行
-H BDB 文件的保存目录
-N Performance improvement
-R 太久的日志文件会被删除。
-L 日志缓存大小,默认是32K。 1024表示1024K。

其它参数:
-h help
-vv 更加详细的输出
不使用-d的话,输出会直接显示到控制台。

ZEND_QUEUE

zend framework有一个与MEMCACHEQ通信的adapter:
Zend_Queue_Adapter_Memcacheq

http://framework.zend.com/manual/en/zend.queue.adapters.html

下面用一个真实的例子来演示如何在zend framework中使用MEMCACHEQ。

一个新闻网站,每条新闻显示的时候,都要显示出来此新闻的访问量,同时还要把它的访问量加1。

这个访问量是保存到news表中的,与news的其它信息保存在一起。
这个数据变化得非常快,缓存的意义不大。
如果每次用户查看新闻的时候,都去数据库中执行一次update visitCount+1的操作,
肯定是比较费力的。
用户必须等待update完成之后,才能看到新闻的内容。

使用MEMCACHEQ之后呢,我们可以把每一次访问都记录到消息队列中,然后在后台再周期性去更新数据库。
写入消息队列的速度是非常快的,比直接更新mysql快得多得多。

在viewNews.php中:

<?php
// MemcacheQ config
$queueOptions = array(
'name' => 'example-queue',
'driverOptions' => array(
'host' => '127.0.0.1',
'port' => 22201
)
); // Instantiate Zend_Queue
$queue = new Zend_Queue('MemcacheQ', $queueOptions); // Find out if the queue exists
if (!$queue->getAdapter()->isExists($queueOptions['name']))
{
// If not, create it
$queue->createQueue($queueOptions['name']);
} // Build a query string (key=val&key=val) because we need a scalar value
//用户在$timestamp访问了$page页面。
$params = http_build_query(
array(
'timestamp' => $timestamp,
'page' => $page
)
);
// Send the data to the queue
$queue->send($params);

这样就把这一次访问保存到了消息队列[example-queue]中。

然后再搞个cron,去处理队列中的消息。

<?php
// MemcacheQ config
$queueOptions = array(
'name' => 'example-queue',
'driverOptions' => array(
'host' => '127.0.0.1',
'port' => 22201
)
); // Instantiate Zend_Queue
$queue = new Zend_Queue('MemcacheQ', $queueOptions); // Retrieve 5 items from the queue
$messages = $queue->receive(5); // $message is now a instance of Zend_Queue_Message_Iterator
// @TODO: Use a nice FilterIterator ;)
foreach ($messages as $job)
{
if ('creating queue' == $job->body || false === $job->body)
{
// Skip message
continue;
}
// Parse the query string to a array
parse_str($job->body, $data); // Execute the heavy process
//更新数据库
$this->registerHit($data['timestamp'], $data['page']);
}

【转】持久化消息队列之MEMCACHEQ的更多相关文章

  1. 持久化消息队列memcacheq的安装配置

    MemcacheQ 是一个基于 MemcacheDB 的消息队列服务器. 一.memcacheq介绍 特性: 1.简单易用 2.处理速度快 3.多条队列 4.并发性能好 5.与memcache的协议兼 ...

  2. 【ActiveMQ】持久化消息队列的三种方式

    1.ActiveMQ消息持久化方式,分别是:文件.mysql数据库.oracle数据库 2.修改方式: a.文件持久化: ActiveMQ默认的消息保存方式,一般如果没有修改过其他持久化方式的话可以不 ...

  3. PHP结合memcacheq消息队列解决并发问题

    在处理业务逻辑时有可能遇到高并发问题,例如商城秒杀.微博评论等.如果不做任何措施可能在高瞬间造成服务器瘫痪,如何解决这个问题呢?队列是个不错的选择.队列(Queue)又称先进先出(First In F ...

  4. HQueue:基于HBase的消息队列

    HQueue:基于HBase的消息队列   凌柏   ​1. HQueue简介 HQueue是一淘搜索网页抓取离线系统团队基于HBase开发的一套分布式.持久化消息队列.它利用HTable存储消息数据 ...

  5. C#内存映射文件消息队列实战演练(MMF—MQ)

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  6. Redis5新特性Streams作消息队列

    前言 Redis 5 新特性中,Streams 数据结构的引入,可以说它是在本次迭代中最大特性.它使本次 5.x 版本迭代中,Redis 作为消息队列使用时,得到更完善,更强大的原生支持,其中尤为明显 ...

  7. Azure Messaging-ServiceBus Messaging消息队列技术系列4-复杂对象消息是否需要支持序列化和消息持久化

    在上一篇中,我们介绍了消息的顺序收发保证: Azure Messaging-ServiceBus Messaging消息队列技术系列3-消息顺序保证 在本文中我们主要介绍下复杂对象消息是否需要支持序列 ...

  8. Python操作rabbitmq消息队列持久化

    消息队列持久化 Python操作rabbit消息队列的持久化,如下: # 创建一个名为balance的队列,对queue进行durable持久化设为True(持久化第一步)channel.queue_ ...

  9. rabbitmq消息队列,消息发送失败,消息持久化,消费者处理失败相关

    转:https://blog.csdn.net/u014373554/article/details/92686063 项目是使用springboot项目开发的,前是代码实现,后面有分析发送消息失败. ...

随机推荐

  1. Android上dip、dp、px、sp等单位说明

    Android上dip.dp.px.sp等单位说明 dip  device independent pixels(设备独立像素). 不同设备不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA ...

  2. Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php )

    Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php ) 1.1. 这些流氓软件使用操作系统os提供的普通api根本就杀不掉啊1 1.2. 使用 ...

  3. 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面

    在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ...

  4. android TextView 文字垂直的设置

    <TextView android:id="@+id/tv_status" android:layout_width="wrap_content" and ...

  5. Android源码

    Android 源码:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/

  6. 【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数

                  本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新    Matlab和C#混合编程文章目录 :[目录]Matlab和C#混合编程文章目录 在我的上一篇文章[ ...

  7. Java多线程系列--“JUC集合”04之 ConcurrentHashMap

    概要 本章是JUC系列的ConcurrentHashMap篇.内容包括:ConcurrentHashMap介绍ConcurrentHashMap原理和数据结构ConcurrentHashMap函数列表 ...

  8. 包管理器Bower

    今天自己用Angular写东西的时候,下载了Angular-seed项目,发现需要用到bower,之前也使用过,没有仔细了解,今天趁机了解到一些. bower的官网地址: http://bower.i ...

  9. Unity中 动态加载 Resources.Load()和Asset Bundle 的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载. 初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安装包里,没有到的不会跟进去.我们在编辑器里看到的Ass ...

  10. 一套后台管理html模版

    最近自己需要一套后台管理的模版,然后去网上查找,模版的确很多,但是适合我的并不多.我需要的模版是不会很大,我能够控制代码,样式不要太古朴,最好有点CSS3的效果.最后终于找到一张主页,然后再根据这个主 ...