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 相关文章推荐
在任意字符集下正常显示网页的方法一
Apr 01 PHP
PHP输入流php://input介绍
Sep 18 PHP
PHP清除字符串中所有无用标签的方法
Dec 01 PHP
php关键字仅替换一次的实现函数
Oct 29 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
Nov 10 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
Jun 27 PHP
PHP中PCRE正则解析代码详解
Apr 26 PHP
PHP基础之输出缓冲区基本概念、原理分析
Jun 19 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 PHP
PHP大文件及断点续传下载实现代码
Aug 18 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
phpBB BBcode处理的漏洞
2006/10/09 PHP
php 随机生成10位字符代码
2009/03/26 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
thinkPHP自动验证机制详解
2016/12/05 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
Js apply方法详解
2017/02/16 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
React学习之受控组件与数据共享实例分析
2020/01/06 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
Python将xml和xsl转换为html的方法
2015/03/10 Python
python安装mysql-python简明笔记(ubuntu环境)
2016/06/25 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
Python插入Elasticsearch操作方法解析
2020/01/19 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
女方婚礼新郎答谢词
2014/01/11 职场文书
小学生环保演讲稿
2014/04/25 职场文书
大学生党员自我评价
2015/03/04 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server
晶体管来复再生式二管收音机
2021/04/22 无线电
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL