首页 > 技术文章 > tp5.1结合topthink-queue实现秒杀@ShineYork

pony-mamba 2020-09-02 17:20 原文

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
更多的请求看这里 https://blog.csdn.net/moonpure/article/details/72674374

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请求

填写测试的接口

这是展示不同的结果内容,就是测试之后的情况

其他相关使用看这个网址 https://www.hissummer.com/

Redis
https://github.com/MicrosoftArchive/redis/releases/tag/win-3.2.100

下载之后双击安装,同时配置环境变量
然后redis要安装成功

运行redis-server redis.windows.conf出现如下内容也是没有关系

只需要运行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(一定要保证版本的正确性)
下载地址:
http://windows.php.net/downloads/pecl/snaps/redis/2.2.5/
http://windows.php.net/downloads/pecl/releases/igbinary/1.2.1/

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

推荐阅读