持久化消息队列之MEMCACHEQ
来源:互联网 发布:杭州 人工智能 医院 编辑:程序博客网 时间:2024/05/22 03:22
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 existsif (!$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
- Memcache 持久化消息队列MemcacheQ
- Memcache 持久化消息队列MemcacheQ
- 分布式持久化消息队列memcacheq的安装部署
- 持久化消息队列memcacheq的安装配置
- MemcacheQ(消息队列)
- RabbitMQ之队列与消息持久化
- RabbitMQ之队列与消息持久化
- memcacheq安装与消息队列
- RabbitMQ之消息持久化(队列持久化、消息持久化)
- RabbitMQ之消息持久化(队列持久化、消息持久化)
- 消息队列服务器 memcacheq的搭建
- php消息队列MemcacheQ 安装与使用
- rabbitmq消息和队列持久化
- RabbitMQ队列与消息的持久化
- PHP结合memcacheq消息队列解决并发问题
- PHP结合memcacheq消息队列解决并发问题
- 消息队列在项目中的使用(memcacheq)
- Altium Designer 笔记(零)总纲
- quartz框架如何设置只有一个定时任务但是可以多个时间段来执行
- 【BZOJ 4176】 Lucas的数论 - 杜教筛
- JAVA XML读取-DOM4J、JDOM、DOM、SAX四大方法总结
- 四大组件之activity(生命周期)
- 持久化消息队列之MEMCACHEQ
- 【iOS开发】ld: library not found for -lPods-iDoctors-AFNetworking 编译报错Xcode
- Unable to locate package xxx
- 获取当前网络和地理位置
- 主流视频编码标准的发展
- Android编程至高武学之《如来神掌》第二式~金顶佛灯
- jQuery学习笔记(四) 事件及特效
- adb通过wifi连接android设备
- rpm 包管理