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教程归纳总结
Jun 07 PHP
PHP 程序员也要学会使用“异常”
Jun 16 PHP
php cli 方式 在crotab中运行解决
Feb 08 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
Jun 17 PHP
三种php连接access数据库方法
Nov 11 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
Nov 29 PHP
php实现CSV文件导入和导出
Oct 24 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
Jul 18 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
Feb 04 PHP
php中类和对象:静态属性、静态方法
Apr 09 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP判断当前使用的是什么浏览器(推荐)
Oct 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
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
Laravel 4.2 中队列服务(queue)使用感受
2014/10/30 PHP
php实现异步数据调用的方法
2015/12/24 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
2011/08/15 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
flash+jQuery实现可关闭及重复播放的压顶广告
2015/04/15 Javascript
js获取form的方法
2015/05/06 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
详解Vue 如何监听Array的变化
2019/06/06 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
Python实现文件复制删除
2016/04/19 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
AE美国鹰美国官方网站:American Eagle Outfitters
2016/08/22 全球购物
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
学前教育教师求职自荐信
2013/09/22 职场文书
大学四年学习的自我评价分享
2013/12/09 职场文书
师范生自我鉴定
2014/03/20 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电