什么是队列,是先进先出的线性表,在具体应用中通常用链表或者数组来实现,队列只允许在后端进行插入操作,在前端进行删除操作。
看看各语言实现队列的方法:
什么情况下会用了队列呢,并发请求又要保证事务的完整性的时候就会用到队列,当然不排除使用其它更好的方法。
队列还可以用于减轻数据库服务器压力,我们可以将不是即时数据放入到队列中,在数据库空闲的时候或者间隔一段时间后执行。比如发送邮件消息服务,没有必要即时的执行,在没有使用队列的时候sql语句是这样的
PHP实现队列:第一个元素作为队头,最后一个元素作为队尾
<?php /** * 队列就是这么简单 * */ $array = array('PHP', 'JAVA'); array_push($array, 'PYTHON'); //入队列 array_shift($array); //出队列
什么是双端队列(或双向队列)Deque,全名double-ended queue?
即元素可以在队列的任意一段入队或出队,如果我们把这些方法叫做insertLeft()和insertRight(),以及removeLeft()和removeRight()。如果严格禁止调用insertLeft()和removeLeft()方法(或禁用右段的操作),双端队列功能就和栈一样。禁止调用insertLeft()和removeRight()(或相反的另一对方法),它的功能就和队列一样了。双端队列与栈或队列相比,是一种多用途的数据结构。
参考资料:http://blog.csdn.net/woshihaiyong168/article/details/52846205
<?php/* * PHP实现队列操作类 */class queueOp { /* * 队尾入队 * Return:处理之后队列的元素个数 */ public function tailEnqueue($arr,$val) { return array_push($arr,$val); } /* * 队尾出队 * Return:最后一个值,如果数组为空或不是数组,返回NULL * Comment:仅用于双向队列 */ public function tailDequeue($arr) { return array_pop($arr); } /* * 队首入队 * Return:处理之后队列的元素个数 * Comment:仅用于双向队列 */ public function headEnqueue($arr,$val) { return array_unshift($arr,$val); } /* * 队首出队 * Return:移出的值,如果参数不是数组或数组为空,返回NULL */ public function headDequeue($arr) { return array_shift($arr); } /* * 队列长度 * Return:返回队列的长度(元素个数) */ public function queueLength($arr) { return count($arr); } /* * 获取队首元素 * Return:第一个元素的值,如果队列为空则返回FALSE */ public function queueHead($arr) { return reset($arr); } /* * 获取队尾元素 * Return:最后一个元素的值,如果队列为空则返回FALSE */ public function queueTail($arr) { return end($arr); } /* * 清空队列 * Return:无返回值 */ public function clearQueue($arr) { unset($arr); } }
栈
栈(stack)与队列相似,都是操作受到了限制的表,不同的是栈实行的是先入后出的原则,先进入的元素会被压到栈底,后进入的元素位于栈顶,栈只会对栈顶一端的元素进行操作,栈的操作包括入栈和出栈,都是从栈顶端进行操作。
PHP实现栈与实现队列极其相似,了解了栈的原理之后,只需要将队列部份的类实现代码去除队列头部的插入与删除操作,即可成为栈的操作类,只需将队尾换成栈顶,队首换成栈底即可。
参考地址:http://blog.csdn.net/ljl890705/article/details/50380291
PHP和MySQL实现消息队列
参考地址:http://www.cnblogs.com/chunguang/p/5757304.html
PHP的轻量消息队列php-resque使用说明
参考资料:http://avnpc.com/pages/run-background-task-by-php-resque