开发者社区> x3d> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【转】持久化消息队列之MEMCACHEQ

简介: G MEMCACHEQ AS MESSAGE QUEUE PHP,消息队列,MEMCACHEQ 使用消息队列(MESSAGE QUEUE)可以把某些耗时的工作推后,然后在后台慢慢地去执行,这样就不会让你的用户等待太久。
+关注继续查看

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']);
}

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Zookeeper】源码分析之持久化(二)之FileSnap
 前篇博文已经分析了FileTxnLog的源码,现在接着分析持久化中的FileSnap,其主要提供了快照相应的接口。
38 0
Oracle 加密package解密(unwrap)
最近碰到一个问题,需要解密几个使用oracle wrap加密过的程序包,查了下,已经有很多可用的程序,支持10g,11g,连12c都支持。查找过程中,花了点时间研究了下解密的过程,简单记录一下。
1409 0
+关注
x3d
编程语言相关技术专家
文章
问答
文章排行榜
最热
最新
相关电子书
更多
消息队列kafka介绍
立即下载
消息队列 Kafka 版差异化特性
立即下载
低代码开发师(初级)实战教程
立即下载