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 cookie 作用范围?不要在当前页面使用你的cookie
Mar 24 PHP
php反弹shell实现代码
Apr 22 PHP
解析PHP对现有搜索引擎的调用
Jun 25 PHP
php异常处理使用示例
Feb 25 PHP
PHP中使用xmlreader读取xml数据示例
Dec 29 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
php操作memcache缓存方法分享
Jun 03 PHP
php实现图片以base64显示的方法
Oct 13 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
php支付宝系列之电脑网站支付
May 30 PHP
php 将json格式数据转换成数组的方法
Aug 21 PHP
PHP的垃圾回收机制代码实例讲解
Feb 27 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 输出简单动态WAP页面
2009/06/09 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
javascript中window.event事件用法详解
2012/12/11 Javascript
jQuery在html有效在jsp无效的原因及解决方法
2013/08/02 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
javascript学习笔记之函数定义
2015/06/25 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
详解vue express启动数据服务
2017/07/05 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
js计时事件实现圆形时钟
2020/03/25 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
python 示例分享---逻辑推理编程解决八皇后
2014/07/20 Python
python处理大数字的方法
2015/05/27 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
Python可变参数用法实例分析
2017/04/02 Python
Python3.5 创建文件的简单实例
2018/04/26 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
在python中画正态分布图像的实例
2019/07/08 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
Python安装OpenCV的示例代码
2020/03/05 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
2020/03/30 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
linux面试题参考答案(7)
2014/07/24 面试题
校庆活动方案
2014/03/31 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
党的群众路线教育实践活动整改方案
2014/10/28 职场文书
辞职信范文大全
2015/03/02 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL