tp5.1结合topthink-queue实现秒杀@ShineYork
1.什么是秒杀
秒杀活动是⼀些购物平台推出的集中⼈⽓的活动,⼀般商品数量很少,价格很便宜,限定开始购买的时间,会在以秒为单位的时间内被购买⼀空。⽐如原价千元甚⾄万元的商品以⼀元的价格出售,但数量只有⼀件,在某天的某个时间开始出售,这就造成很多⼈去抢这⼀件商品。当然想抢到是需要很多因素的,⽐如你的电脑配置、⽹速,还有你的运⽓。
2.秒杀会带来的问题
1、⾼并发
  ⽐较⽕热的秒杀在线⼈数都是10w起的,如此之⾼的在线⼈数对于⽹站架构从前到后都是⼀种考验。
2、超卖
  任何商品都会有数量上限,如何避免成功下订单买到商品的⼈数不超过商品数量的上限,这是每个抢购活动都要⾯临的难题。
3.解决的⽅式
前台:
A:扩容
  加机器,这是最简单的⽅法,通过增加前端池的整体承载量来抗峰值。
B:静态化
将活动页⾯上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。
C:限流
⼀般都会采⽤IP级别的限流,即针对某⼀个IP,限制单位时间内发起请求数量。或者活动⼊⼝的时候增加游戏或者问题环节进⾏消峰操作。
//……….
后台:
A: 锁机制
乐观锁,就是在数据库设计⼀个版本号的字段,每次修改都使其+1,这样在提交时⽐对提交前的版本号就知道是不是并发提交了,但是有个缺点就是只能是应⽤中控制,如果有跨应⽤修改同⼀条数据乐观锁就没办法了,这个时候可以考虑悲观锁。
悲观锁,就是直接在数据库层⾯将数据锁死,类似于oralce中使⽤select xxxxx from xxxx where xx=xx for update,这样其他线程将⽆法提交数据。
B: redis队列
引⼊队列,然后将所有写DB操作在单队列中排队,完全串⾏处理。当达到库存阀值的时候就不在消费队列,并关闭购买功能。这就解决了超卖问题。
优点:解决超卖问题,略微提升性能。
缺点:性能受限于队列处理机处理性能和DB的写⼊性能中最短的那个,另外多商品同时抢购的时候需要准备多条队列。
//……….
4.准备⼯具
测试⼯具压⼒测试⼯具ab或者jmeter- 这⾥我们会使⽤jmeter
更多的请求看这⾥
Redis⼯具的安装,以及redis的扩展安装
Jmeter:
这是⼀个绿⾊的⼯具,但是它需要依赖与jdk 8的环境,所以在安装的时候需要安装jdk8。
双击就可以安装,安装之后把
C:\Program Files (x86)\Java\jre1.8.0_181\bin
这个地址配置到环境变量中
一元秒杀汽车然后cmd即可出现如下内容则ok
接下来解压它
解压之后 apache-jmeter-5.0\apache-jmeter-5.0\bin
到这个jmeter.bat双击运⾏
出现这个界⾯就ok
但是在第⼀次打开的时候其实是⼀个英⽂的
设置默认为中⽂则可以修改jmeter.properties 添加language=zh_CN
⿏标右键-》选择线程组
线程数就是⽤户量
Ramp-Up period指的是每个线程间隔多长时间,如果设置为0,就是并发;
选择http请求
填写测试的接⼝
这是展⽰不同的结果内容,就是测试之后的情况
其他相关使⽤看这个⽹址
Redis
下载之后双击安装,同时配置环境变量
然后redis要安装成功
运⾏redis-server f出现如下内容也是没有关系
只需要运⾏redis-cli有结果则安装成
安装php-redis扩展
1.使⽤phpinfo()函数查看PHP的版本信息,这会决定扩展⽂件版本。
2.下载php_igbinary-1.2.1-5.5-ts-vc11-x64.zip,php_redis-2.2.5-5.6-ts-vc11-x64.zip(⼀定要保证版本的正确性)
下载地址:
3.解压缩后,将php_redis.dll和php_redis.pdb拷贝⾄php的ext⽬录下
4.修改php.ini,(PS:此php.ini⽂件是在Apache⽬录)在该⽂件中加⼊:
; php_redis
extension=php_igbinary.dll
extension=php_redis.dll
注意:extension=php_igbinary.dll⼀定要放在extension=php_redis.dll的前⾯,否则此扩展不会⽣效
5.重启Apache后,使⽤phpinfo查看扩展是否成功安装
Redis的特点:
redis是单线程
1.性能极⾼ – Redis能读的速度是110000次/s,写的速度是81000次/s 。
2.丰富的数据类型 – Redis⽀持⼆进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3.原⼦ – Redis的所有操作都是原⼦性的,意思就是要么成功执⾏要么失败完全不执⾏。单个操作是原⼦性的。多个操作也⽀持事务,即原⼦性,通过MULTI和EXEC指令包起来。
4.丰富的特性 – Redis还⽀持 publish/subscribe, 通知, key 过期等等特性。
Redis能实现秒杀的重要因素:
使⽤redis队列,因为pop操作是原⼦的,即使有很多⽤户同时到达,也是依次执⾏
同时下载好组件think-queue
composer require topthink/think-queue