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+Html+缓存
Dec 20 PHP
php 静态页面中显示动态内容
Aug 14 PHP
PHP实现变色验证码实例
Jan 06 PHP
php中使用base HTTP验证的方法
Apr 20 PHP
编写PHP脚本过滤用户上传的图片
Jul 03 PHP
php设置页面超时时间解决方法
Sep 22 PHP
PHP中set error handler函数用法小结
Nov 11 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
Nov 17 PHP
Yii框架组件和事件行为管理详解
May 20 PHP
PHP简单预防sql注入的方法
Sep 27 PHP
详解如何在云服务器上部署Laravel
Jun 30 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 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 文件状态缓存带来的问题
2008/12/14 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
php基于curl实现的股票信息查询类实例
2016/11/11 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
jQuery制作可自定义大小的拼图游戏
2015/03/30 Javascript
百度地图api如何使用
2015/08/03 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
jquery mobile开发常见问题分析
2016/01/21 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
初学node.js中实现删除用户路由
2019/05/27 Javascript
JS查找孩子节点简单示例
2019/07/25 Javascript
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
JS实现4位随机验证码
2020/10/19 Javascript
学习python (1)
2006/10/31 Python
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
Python进程间通信之共享内存详解
2017/10/30 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
C语言中break与continue的区别
2012/07/12 面试题
新闻编辑自荐书范文
2014/02/12 职场文书
测控技术自荐信
2014/06/05 职场文书
法人代表证明书格式
2014/10/01 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python
关于HTML编码导致的乱码问题
2021/09/04 HTML / CSS