php Memcache 中实现消息队列


Posted in PHP onNovember 24, 2009

对于一个很大的消息队列,频繁进行进行大数据库的序列化 和 反序列化,有太耗费。下面是我用PHP 实现的一个消息队列,只需要在尾部插入一个数据,就操作尾部,不用操作整个消息队列进行读取,与操作。但是,这个消息队列不是线程安全的,我只是尽量的避免了冲突的可能性。如果消息不是非常的密集,比如几秒钟才一个,还是可以考虑这样使用的。
如果你要实现线程安全的,一个建议是通过文件进行锁定,然后进行操作。下面是代码:

class Memcache_Queue 
{ 
private $memcache; 
private $name; 
private $prefix; 
function __construct($maxSize, $name, $memcache, $prefix = "__memcache_queue__") 
{ 
if ($memcache == null) { 
throw new Exception("memcache object is null, new the object first."); 
} 
$this->memcache = $memcache; 
$this->name = $name; 
$this->prefix = $prefix; 
$this->maxSize = $maxSize; 
$this->front = 0; 
$this->real = 0; 
$this->size = 0; 
} 
function __get($name) 
{ 
return $this->get($name); 
} 
function __set($name, $value) 
{ 
$this->add($name, $value); 
return $this; 
} 
function isEmpty() 
{ 
return $this->size == 0; 
} 
function isFull() 
{ 
return $this->size == $this->maxSize; 
} 
function enQueue($data) 
{ 
if ($this->isFull()) { 
throw new Exception("Queue is Full"); 
} 
$this->increment("size"); 
$this->set($this->real, $data); 
$this->set("real", ($this->real + 1) % $this->maxSize); 
return $this; 
} 
function deQueue() 
{ 
if ($this->isEmpty()) { 
throw new Exception("Queue is Empty"); 
} 
$this->decrement("size"); 
$this->delete($this->front); 
$this->set("front", ($this->front + 1) % $this->maxSize); 
return $this; 
} 
function getTop() 
{ 
return $this->get($this->front); 
} 
function getAll() 
{ 
return $this->getPage(); 
} 
function getPage($offset = 0, $limit = 0) 
{ 
if ($this->isEmpty() || $this->size < $offset) { 
return null; 
} 
$keys[] = $this->getKeyByPos(($this->front + $offset) % $this->maxSize); 
$num = 1; 
for ($pos = ($this->front + $offset + 1) % $this->maxSize; $pos != $this->real; $pos = ($pos + 1) % $this->maxSize) 
{ 
$keys[] = $this->getKeyByPos($pos); 
$num++; 
if ($limit > 0 && $limit == $num) { 
break; 
} 
} 
return array_values($this->memcache->get($keys)); 
} 
function makeEmpty() 
{ 
$keys = $this->getAllKeys(); 
foreach ($keys as $value) { 
$this->delete($value); 
} 
$this->delete("real"); 
$this->delete("front"); 
$this->delete("size"); 
$this->delete("maxSize"); 
} 
private function getAllKeys() 
{ 
if ($this->isEmpty()) 
{ 
return array(); 
} 
$keys[] = $this->getKeyByPos($this->front); 
for ($pos = ($this->front + 1) % $this->maxSize; $pos != $this->real; $pos = ($pos + 1) % $this->maxSize) 
{ 
$keys[] = $this->getKeyByPos($pos); 
} 
return $keys; 
} 
private function add($pos, $data) 
{ 
$this->memcache->add($this->getKeyByPos($pos), $data); 
return $this; 
} 
private function increment($pos) 
{ 
return $this->memcache->increment($this->getKeyByPos($pos)); 
} 
private function decrement($pos) 
{ 
$this->memcache->decrement($this->getKeyByPos($pos)); 
} 
private function set($pos, $data) 
{ 
$this->memcache->set($this->getKeyByPos($pos), $data); 
return $this; 
} 
private function get($pos) 
{ 
return $this->memcache->get($this->getKeyByPos($pos)); 
} 
private function delete($pos) 
{ 
return $this->memcache->delete($this->getKeyByPos($pos)); 
} 
private function getKeyByPos($pos) 
{ 
return $this->prefix . $this->name . $pos; 
} 
}
PHP 相关文章推荐
PHP+MYSQL的文章管理系统(二)
Oct 09 PHP
用PHP4访问Oracle815
Oct 09 PHP
利用PHP实现与ASP Banner组件相似的类
Oct 09 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
PHP页面间传递参数实例代码
Jun 05 PHP
使用php来实现网络服务
Sep 15 PHP
关于Appserv无法打开localhost问题的解决方法
Oct 16 PHP
ThinkPHP 404页面的设置方法
Jan 14 PHP
Thinkphp事务操作实例(推荐)
Apr 01 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
Aug 07 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 PHP
php中字符串和整数比较的操作方法
Jun 06 PHP
phplock(php进程锁) v1.0 beta1
Nov 24 #PHP
PHP 进程锁定问题分析研究
Nov 24 #PHP
PHP 递归效率分析
Nov 24 #PHP
PHP 单引号与双引号的区别
Nov 24 #PHP
PHP小程序自动提交到自助友情连接
Nov 24 #PHP
php 引用(&amp;)详解
Nov 20 #PHP
php+javascript的日历控件
Nov 19 #PHP
You might like
PHP中的串行化变量和序列化对象
2006/09/05 PHP
使用PHP维护文件系统
2006/10/09 PHP
php获取mysql版本的几种方法小结
2008/03/25 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
无JS,完全php面向过程数据分页实现代码
2012/08/27 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
Symfony2实现在controller中获取url的方法
2016/03/18 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
JavaScript高级程序设计
2006/12/29 Javascript
javascript 对象定义方法 简单易学
2009/03/22 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
详解用node编写自己的cli工具
2017/05/23 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
python基础教程之缩进介绍
2014/08/29 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
Python下简易的单例模式详解
2019/04/08 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
Python3实现监控新型冠状病毒肺炎疫情的示例代码
2020/02/13 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
中专生职业生涯规划书范文
2014/01/10 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
节水倡议书
2015/01/19 职场文书
教师网络培训心得体会
2016/01/09 职场文书