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 相关文章推荐
自动跳转中英文页面
Oct 09 PHP
PHP学习之PHP运算符
Oct 09 PHP
令PHP初学者头疼十四条问题大总结
Nov 12 PHP
Ajax+PHP 边学边练 之二 实例
Nov 24 PHP
一个PHP缓存类代码(附详细说明)
Jun 09 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
php blowfish加密解密算法
Jul 02 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
PHP实现数组根据某个单元字段排序操作示例
Aug 01 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 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 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
php 获取全局变量的代码
2011/04/21 PHP
php中将时间差转换为字符串提示的实现代码
2011/08/08 PHP
php中addslashes函数与sql防注入
2014/11/17 PHP
php实现的验证码文件类实例
2015/06/18 PHP
joomla实现注册用户添加新字段的方法
2016/05/05 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
Prototype Class对象学习
2009/07/19 Javascript
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
正负小数点后两位浮点数实现原理及代码
2013/09/06 Javascript
nodejs中实现路由功能
2014/12/29 NodeJs
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
Python json模块使用实例
2015/04/11 Python
Python实现随机生成手机号及正则验证手机号的方法
2018/04/25 Python
对Python中plt的画图函数详解
2018/11/07 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
用友笔试题目
2016/10/25 面试题
物流专业大学生求职信范文
2013/10/28 职场文书
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
会计毕业自我鉴定
2014/02/05 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书
Redis 哨兵机制及配置实现
2022/03/25 Redis
js作用域及作用域链工作引擎
2022/07/07 Javascript