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实现 使用PHP数组内部指针操作函数
Oct 12 PHP
不重新编译PHP为php增加openssl模块的方法
Jun 14 PHP
php无限分类且支持输出树状图的详细介绍
Jun 19 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
php判断对象是派生自哪个类的方法
Jun 20 PHP
ThinkPHP模型详解
Jul 27 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
CI(CodeIgniter)框架视图中加载视图的方法
Mar 24 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
php实现文件预览功能
May 23 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
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+Html+缓存
2006/11/25 PHP
php实现最简单的MVC框架实例教程
2014/09/08 PHP
smarty简单应用实例
2015/11/03 PHP
PHP控制反转(IOC)和依赖注入(DI)
2017/03/13 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
js中的escape及unescape函数的php实现代码
2007/09/04 Javascript
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
2016/12/13 Javascript
js微信支付实现代码
2016/12/22 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
详解webpack+ES6+Sass搭建多页面应用
2018/11/05 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
快速解决element的autofocus失效问题
2020/09/08 Javascript
python通过索引遍历列表的方法
2015/05/04 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
2017/06/01 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python将主机名转换为IP地址的方法
2019/08/14 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
python实现差分隐私Laplace机制详解
2019/11/25 Python
python+opencv3生成一个自定义纯色图教程
2020/02/19 Python
中东奢侈品购物网站:Ounass
2020/09/02 全球购物
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
给医务人员表扬信
2014/01/12 职场文书
售后求职信范文
2014/03/15 职场文书
公司业务员岗位职责
2014/03/18 职场文书
工商干部先进事迹
2014/05/14 职场文书
前台接待员岗位职责
2015/04/15 职场文书
高一军训感想
2015/08/07 职场文书
Python合并pdf文件的工具
2021/07/01 Python