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 相关文章推荐
Windows2003 下 MySQL 数据库每天自动备份
Dec 21 PHP
简单的过滤字符串中的HTML标记
Dec 25 PHP
php feof用来识别文件末尾字符的方法
Aug 01 PHP
PHP的explode和implode的使用说明
Jul 17 PHP
PHP下判断网址是否有效的代码
Oct 08 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
Aug 10 PHP
php实现aes加密类分享
Feb 16 PHP
PHP获取photoshop写入图片文字信息的方法
Mar 31 PHP
php 获取文件行数的方法总结
Oct 11 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
PHP代码重构方法漫谈
Apr 17 PHP
浅谈PHP封装CURL
Mar 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中将网页导出为Word文档的代码
2012/05/25 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
2016/06/22 Javascript
vue中将网页打印成pdf实例代码
2017/06/15 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
使用python实现strcmp函数功能示例
2014/03/25 Python
Python Web开发模板引擎优缺点总结
2014/05/06 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python pygame模块编写飞机大战
2018/11/20 Python
只需7行Python代码玩转微信自动聊天
2019/01/27 Python
python Kmeans算法原理深入解析
2019/08/23 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
Django models filter筛选条件详解
2020/03/16 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
python_matplotlib改变横坐标和纵坐标上的刻度(ticks)方式
2020/05/16 Python
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
大专生工程监理求职信
2013/10/04 职场文书
法院先进个人事迹材料
2014/05/04 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
市场营销计划书
2015/01/17 职场文书
运输公司工作总结
2015/08/11 职场文书