一、简单的介绍
Redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。MySQLi是一个开源使用的MySQL连接扩展,用于对数据库的操作和管理。php-redis是一个开源的使用C语言编写的php扩展,用于php连接、管理redis。二、业务介绍
某商城搞促销活动,会有大量的订单涌入数据库,每个订单15分钟未支付即为过期订单并且不能继续支付。
二、需求分析
很显然此业务需求在不使用redis队列的情况下,大量的订单并发会造成阻塞,甚至有可能超时(php默认的超时时间为30s)。
那么就会有以下步骤:(1)用户下单后把数据直接写入消息队列(list)而不是数据库,写入队列成功即返回用户成功消息。(2)创建订单队列:启动脚本来处理订单队列,逐一写入数据库,并设置一个key为订单号的hash过期时间为15分钟。(3)用户支付时首先拿这个订单号去redis里查是存在,如存在订单状态为正常状态,否则为过期状态。(4)订单支付成功队列:支付成功后,把订单数据写入另一个队列中,并启动脚本处理订单状态都为‘支付成功’的队列(如发送消息,修改订单状态等操作)。
注意:这期间可能会出现数据量过大,订单创建的队列尚未执行完毕,订单支付成功后查找该订单却未找到(lpop),那么就需要把这个未找到的订单重新添加到队列的最后(rpush)。
三、代码实现(1)创建订单:create_order.php
(2)订单入库insert_db.php(以守护进程启动)
(3)监听过期的订单watch_order.php(以守护进程启动)
(4)支付成功后的订单处理success_order.php(以守护进程启动)代码上边代码一样不做展示。
(5)另外可增加日志队列处理来发送错误邮件给管理员send_error_mail.php(以守护进程启动)——————————–
四、总结
本文只是做业务分析,未在真实的业务场景中进行实现,如有错误还请多多指正。可能会写利用Jmeter来分析该业务代码的效率性能等问题。