在电商活动中,常常会出现高并发的情况,例如很多人同时点击购买按钮,以至于购买人数超出了库存量,这是一种非常不理想的状况,因此,我们在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(1) {try{$value = $redis->LPOP('click');/**利用$value进行逻辑和数据处理*/}catch(Exception $e) {echo $e->getMessage();}
}

数据处理:长连接与事件
为了保证数据处理正常进行,必须和数据库之间建立长连接,因此上面我们采用了pconnect。在于mysql连接时,也要采用长连接,保证数据处理的有效性。同时,由于在后台运行,我们不可能随时获取数据库操作的状态,因此,我们最好采用innodb引擎,对数据库操作事件进行监听,如果出现了异常,要对事件结果进行检查,如果数据插入失败,应该重新执行该事件。

Php+Redis队列原理:https://www.cnblogs.com/wujf-myblog/p/10522150.html
redis 安装成功后外部服务器链接不上:https://www.cnblogs.com/wujf-myblog/p/9566513.html

PHP中利用redis实现消息队列处理高并发请求思路详解相关推荐

  1. php使用redis消息队列swoole,EasySwoole中利用redis实现消息队列

    什么是队列? 从数据结构上来讲,队列是一种先进先出的数据结构 什么是消息队列? 消息队列可以简单理解为:把要传输的数据放在队列中 消息队列可以分为生产者和消费者,将传输的数据放到消息队列当中,就相当于 ...

  2. asp.net c# 通过消息队列处理高并发请求(以抢小米手机为例)

    网站面对高并发的情况下,除了增加硬件, 优化程序提高以响应速度外,还可以通过并行改串行的思路来解决.这种思想常见的实践方式就是数据库锁和消息队列的方式.这种方式的缺点是需要排队,响应速度慢,优点是节省 ...

  3. 消息队列,高并发的救火员

    文章目录 一.前言 二.消息队列三功能 2.1 异步通信 2.2 服务解耦 2.3 流量控制 三.消息队列的两种模型 3.1 队列模型 3.2 发布/订阅模型 3.3 小结 四.消息队列的三个独有设置 ...

  4. java抢单功能_基于消息队列的高并发抢单功能实现方法与流程

    本发明涉及嵌入式软件中间件,具体涉及一种基于消息队列的高并发抢单功能实现方法. 背景技术: 中间件是一种独立的系统软件或服务程序,分布式应用系统借助这种软件在不同的技术之间共享资源,管理计算资源和网络 ...

  5. 消息队列处理高并发【转】

    消息队列处理高并发 2017年11月08日 08:55:48 阅读数:2643 用mq来将耗时比较长或者耗费资源的请求排队,异步处理,减轻服务器压力增加稳定性. 如果是高并发的实时请求,我个人觉得不适 ...

  6. java 结合redis队列_在 Java 中使用 redis 的消息队列服务

    前言 关于 redis 我们前面已经讨论过了缓存.分布式锁.分布式唯一标识.LBS服务的用法,这里我们来谈谈利用 redis 来实现一个消息服务. 典型的消息服务是一个生产者和消费者模式的服务.一般是 ...

  7. springboot利用redis作为消息队列mq使用

    先吐个槽:经常看到有人对不同得消息队列做各种各样得评价以及所谓得性能测试,评估选型等等,岂不知脱离任何业务得技术评估都是瞎扯淡.(公司实际业务技术场景不提,满口胡说kafa怎么样,activemq怎么 ...

  8. 利用Redis实现消息队列原理

    2019独角兽企业重金招聘Python工程师标准>>> 1.由于redis是单线程因此可以用用redis中的List可以实现队列 2.代码模拟 代码结构 生产者模拟程序 /** * ...

  9. C10k破局(一)——线程池和消息队列实现高并发服务器

    一.C10k的由来 互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合.互联网还不够普及,用户也不多,一台服务器同时在线100个用户估计在当时已经算是大型应用了,所以并不存在什么 C10K ...

最新文章

  1. 判断事件源的另一方法
  2. 准备了2个月零21天,面试字节跳动挂在了第三面JVM上
  3. 登录drupal管理员_管理您的Drupal工作流程的最佳方法
  4. 在给函数传递实参时,不能对用到引用的传NULL
  5. linux系统win,Windows10安装运行linux系统的方法
  6. c语言用三目运算符从小到大排列,错题集
  7. 使用C++模板判断是否基本类型
  8. python统计中文字数_Python实现统计文本文件字数的方法
  9. 四川开大c语言程序设计0002,C语言程序设计0002.pdf
  10. android模拟器 gpu,Android模拟器新版升级,新增GPU支持、多点触摸等功能【视频】...
  11. 推荐一款我私藏已久的串口示波神器
  12. 磁共振成像技术发展简史丨科学史
  13. PR曲线、ROC曲线、AUC、AP简单梳理
  14. 中文邮件分类[朴素贝叶斯、支持向量机、Logistic,TF-IDF,词袋模型]
  15. Logback设置property参数
  16. C#篇-unity和序列化和反序列
  17. 产品经理 - 路漫漫其修远兮 (2)
  18. 【设计模式】迪米特法则
  19. 科学计算自由软件SCILAB
  20. JD-JUI 和Jad反编译 最新版1.6.6下载

热门文章

  1. 镀金天空-CSS偏移
  2. python-统计python文件代码行数
  3. HTML——文本属性
  4. CentOS 安装nginx及配置
  5. centos双机热备
  6. 技术人修炼之道阅读笔记(八)归纳法思维
  7. bt_code(2012.3.17)
  8. 【OMNeT+INET】浅谈OMNeT开源库INET(二)
  9. NYOJ Binary String Matching的stl解法 酒馆浪人的博客
  10. python编程狮苹果系统_Python编程狮 v1.2.2 苹果IOS版