原文详见:http://http://www.ucai.cn/blogdetail/7026?mid=1&f=12
可以在线运行查看效果哦!
一、队列使用场景:为什么需要队列
在web开发中,我们经常会遇到需要处理批量任务的时候,这些批量任务可能是用户提交的,也可能是当系统被某个事件触发时需要进行批量处理的,面对这样的任务,如果是用户提交的批量任务,初级程序员只能让用户触发提交动作后,等待服务器处理完毕,并且将结果返回到浏览器,期间用户不能关掉浏览器窗口,如果数据比较大,或者处理速度比较慢,那用户体验将会因此受到直接影响。但是当我们使用某讯或者某浪的邮箱时,点击群发邮件之后,只需等待很短的时间,浏览器提示提交成功,正在发送之类的信息时,用户就可以关掉浏览器,稍后,收件地址栏里的邮箱将陆续收到该群发邮件,再比如群发定时邮件,以及当商城系统中有客户下单,客户,客服,仓库等相关人员收到订单邮件信息。诸如此类,队列的应用范围是如此之广。
二、普通工程师的解决方案和架构师的解决方案
方案1:建表存邮件,消息等,用定时程序取出发送。
方案2:抽象到更高一层,开发一套通用异步处理队列适用于任何复杂的业务逻辑
那么,作为架构师,使用队列的做法,将抽象层和业务层分离,可具有良好的扩展性和可维护性。相比较而言就高明了许多,下面就我们介绍一下自定义队列的实现思路和方法。
三、队列总体设计
1:需要队列程序,提供加入队列接口和取队列接口等
2:需要存储队列,文件或者数据库
3:需要定时程序取出队列并执行
4:其它扩展功能:优先级,日志,定时等
代码的目录结构如下,每个文件的作用用//注释来标明
|--addTask.php //添加任务到队列的例子
|--cronMission.php //定时任务调度程序,例如linux中受crontab直接调用的文件,业务逻辑工程师可以在这个文件中灵活定义自己的队列任务,从而不用每个队列任务都需要上服务器修改crontab,从而在安全性,便捷性方面有很大提高
|--db.php //数据库操作
|--db.sql //建立队列需要用到的基本表结构
|--doQueue.php //执行队列任务
|--Queue.class.php //队列核心业务在这里定义,包括将任务加入队列,读队列,更改队列任务状态
|--sendMsg.php //队列要实现具体任务的业务接口,比如现有系统的发送消息的接口,这里例子中因为将此队列程序和现有系统系统集成,用写入日志来演示
四、队列具体实现一:建任务存储表
1:
先来个最基本的:
CREATE TABLE `queue` (
id int(11) NOT NULL auto_increment primary key,
taskphp varchar(128) NOT NULL default '',
param text not null default '',
status tinyint not null default 0,
ctime timestamp NOT NULL default CURRENT_TIMESTAMP,
KEY (ctime)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
字段解释:
taskphp:处理业务的接口文件
param:处理业务的接口文件需要接收的参数
status:任务处理状态,0为未处理,处理完毕更改为1
相关推荐
2. **死信队列应用场景** - **超时未支付订单处理**:例如,如果一个订单在60分钟内未完成支付,系统需要检查并处理这些超时订单。使用定时任务轮询可能会有时间精度不高的问题,而通过延迟消息队列,可以确保在...
在本文中,我们将深入探讨消息队列的概念,其使用场景,以及如何在C和C++语言中应用到FreeRTOS系统中。 1. **消息队列概念** - 消息队列是一种缓冲区,用于存储来自发送者的消息,然后由接收者按顺序处理。每个...
本次实验加深了对栈和队列这两种线性数据结构的理解,特别是它们之间的区别以及在不同场景下的应用。通过实践,掌握了栈和队列在数组和链表两种存储结构上的基本操作实现,并学会了如何利用这些数据结构来解决实际...
2. 使用JDK自带的DelayQueue:这是一个无界阻塞队列,元素需实现Delayed接口,当延迟时间到达时,元素可以从队列中取出。但这种方式不适用于分布式环境。 3. 消息中间件实现,如RabbitMQ:通过设置消息的存活时间...
Java中的队列是一种数据结构,它遵循先进先出(FIFO)原则,即最先插入的元素将是最先被删除的。...队列是许多算法和并发编程场景的基础,如生产者消费者模型、多线程同步等,因此深入理解和掌握队列的实现至关重要。
栈是一种后进先出(LIFO,Last In First Out)的数据结构,常用于实现递归、表达式求解、括号匹配等场景。在实验中,我们定义了一个名为`SqStack`的栈结构,包含基础指针`base`、栈顶指针`top`以及栈的大小`stack...
循环队列是一种线性数据结构,它在物理结构上实现了一个首尾相接的闭合序列,从而解决了普通队列在满和空时的操作限制。循环队列的主要优点是消除了队头和队尾的特殊状态,使得在处理数据时效率更高。下面将详细介绍...
顺序队列和链式队列的实现 在计算机科学中,队列是一种重要的数据结构,广泛应用于多种领域。在本节中,我们将讨论顺序队列和链式队列的实现。 ...选择哪种实现方式取决于具体的应用场景和需求。
这种结构特别适合于那些需要频繁在两端添加或移除元素的应用场景,比如在算法中实现回文字符串的检测等。双端队列的实现同样可以通过数组或链表来完成,但它提供了比普通队列更丰富的操作集合。 在数据结构的学习和...
在实际的应用场景中,Oracle AQ被广泛应用于各种需要实现应用程序间通信的场合。比如,在医疗保险系统中,医院的应用程序与医保中心的应用程序之间就需要进行通信。当医院需要向医保中心提交患者的医疗费用申请时,...
链队列是基于链表实现的队列,与链栈类似,每个元素也是一个节点,包含数据域和指针域。与循环队列不同,链队列的队头和队尾不存储额外信息,而是通过指向队首元素和队尾元素的指针来表示。链队列的插入和删除操作...
双缓存队列的应用场景主要在于需要高效处理数据的场景,例如,在发送端持续向接收端发送数据包的场景中,可以使用双缓存队列来避免数据丢失的问题。同时,双缓存队列也可以应用于其他需要高效处理数据的场景中。 ...
总的来说,这个通用队列实现结合了C语言的指针特性和动态内存管理,提供了一种轻量级、灵活的解决方案,适用于多种单片机应用场景。通过理解这个实现,我们可以学习到如何在有限的资源下设计高效的数据结构,以及...
通过学习和理解循环队列的原理和C++实现,我们可以更好地应用它来解决实际问题,例如在操作系统中的进程调度、网络数据包的缓冲、图形渲染队列等场景。在编程实践中,熟练掌握循环队列的使用,能帮助我们编写出更加...
它通过将任务放入队列中,然后由一个或多个工作线程按顺序取出并执行,有效地实现了任务的异步处理和调度。下面将详细讨论如何实现C#任务队列及其相关知识点。 1. **线程安全**: - 在多线程环境下,对任务队列的...
5. 应用场景: 这种数据结构设计方法在实际编程中不常见,因为标准库已经提供了高效的队列实现。然而,它是理解和掌握数据结构与算法的重要练习,有助于培养解决问题的灵活性和创新思维。在某些内存受限或特定场景下...
在这个“一个c++11实现的无锁队列”中,我们可以探讨以下几个关键知识点: 1. **无锁编程**:无锁编程是一种并发编程技术,它避免了线程间的竞争条件和死锁问题,通过原子操作保证数据的一致性。在无锁队列中,数据...
2. **解决简单实际问题**:通过运用栈和队列来解决一些简单的实际问题,让学生了解这些数据结构的实际应用场景。 #### 二、实验内容 ##### 实验一:判断字符序列是否为特定模式 **目标**:编写一个算法,判断输入...
在IT行业中,队列是一种非常...总之,高效地实现队列需要考虑到性能、内存利用率、线程安全等因素,具体实现方式取决于应用场景和需求。通过理解和掌握不同的队列实现,开发者能够更好地优化系统性能,解决实际问题。
在这些应用场景中,队列能有效地处理并发访问、资源分配和任务调度等问题。 理解并掌握队列的数据结构对于编程和算法设计至关重要,因为它是许多高级数据结构(如栈、优先队列、广义队列)的基础。同时,队列也是...