文章标题
来源:互联网 发布:开淘宝网店的流程 编辑:程序博客网 时间:2024/06/14 23:56
在电商活动中,常常会出现高并发的情况,例如很多人同时点击购买按钮,以至于购买人数超出了库存量,这是一种非常不理想的状况,因此,我们在PHP开发中就会引入消息队列来解决这种高并发的问题。
思路一览:
当用户点击按钮提交购买请求时,并不直接马上执行购买请求动作,而是将请求动作存入消息列队,用户的请求到此结束,而在服务器后台,从消息列队中逐一取出请求记录,再进行数据库操作,完成处理之后,将处理结果返回给用户。由于消息队列的存取是先进先出(和栈相反),因此,所有处理将按请求顺序进行处理。由于处理是在后台一个一个完成,因此不会对服务器和数据库造成巨大压力。
接下来我们来看下具体的一个实现流程是怎样的。
将请求存入redis
当用户点击按钮时,我们通过ajax将请求发给php进行处理,前台返回给用户正在处理的提示(当然,这种提示让设计师设计出让用户满意的效果)。
$redis = new Redis();$redis->connect('127.0.0.1',6379);try{ $redis->LPUSH('click',$user_id);}catch(Exception $e){ echo $e->getMessage();}
在后台进行数据处理
守护进程
当上述请求存入redis后,就可以直接将结果返回给用户了。我们需要在服务端创建一个后台运行的程序,从redis中取出请求数据,并利用这些数据读取和更新数据库。但是这一切都是后台运行解决的,而非用户请求触发的。
从redis中将请求取出
通过上面的代码,redis中会存储很多请求,这些请求都是准备用来处理的。这个列队已经存在了之后,再服务器后台,则对这些请求进行处理,第一步就是先从redis中逐一取出请求。
$redis = new Redis();$redis->pconnect('127.0.0.1',6379);while(True){ try{ $value = $redis->LPOP('click'); /* * 利用$value进行逻辑和数据处理 */ }catch(Exception $e){ echo $e->getMessage(); }}
数据处理:长连接与事件
为了保证数据处理正常进行,必须和数据库之间建立长连接,因此上面我们采用了pconnect。在于mysql连接时,也要采用长连接,保证数据处理的有效性。同时,由于在后台运行,我们不可能随时获取数据库操作的状态,因此,我们最好采用innodb引擎,对数据库操作事件进行监听,如果出现了异常,要对事件结果进行检查,如果数据插入失败,应该重新执行该事件。原文地址
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 前端学习笔记--AJAX的应用(三)form表单改为AJAX提交
- 怎么查找bug
- css_day04_margin垂直方向的合并现象
- 【分布式存储项目】(8)redis简介及配置
- USACO-Section2.2 Runaround Numbers【暴力枚举】
- 文章标题
- 友善之臂视频监控方案源码学习(1)
- hbase 源代码解析(21) 自定义过滤器
- oracle-架构
- JavaScript全局函数
- 排序算法之选择排序
- 在Windows下搭建GCC+VIM编译环境
- 学习笔记TF027:卷积神经网络
- 友善之臂视频监控方案源码学习(2)