zoukankan      html  css  js  c++  java
  • 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
    更多的请求看这里 https://blog.csdn.net/moonpure/article/details/72674374

    Redis工具的安装,以及redis的扩展安装
    
    Jmeter:
    

    这是一个绿色的工具,但是它需要依赖与jdk 8的环境,所以在安装的时候需要安装jdk8。

    双击就可以安装,安装之后把
    C:Program Files (x86)Javajre1.8.0_181in
    这个地址配置到环境变量中

    然后cmd即可出现如下内容则ok

    接下来解压它

    解压之后 apache-jmeter-5.0apache-jmeter-5.0in

    找到这个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

    只为更好的服务;服务工作者。
  • 相关阅读:
    JavaScript cookie详解
    Javascript数组的排序:sort()方法和reverse()方法
    javascript中write( ) 和 writeln( )的区别
    div做表格
    JS 盒模型 scrollLeft, scrollWidth, clientWidth, offsetWidth 详解
    Job for phpfpm.service failed because the control process exited with error code. See "systemctl status phpfpm.service" and "journalctl xe" for details.
    orm查询存在价格为空问题
    利用救援模式破解系统密码
    SSH服务拒绝了密码
    C# 调用 C++ DLL 中的委托,引发“对XXX::Invoke类型的已垃圾回收委托进行了回调”错误的解决办法
  • 原文地址:https://www.cnblogs.com/pony-mamba/p/13602860.html
Copyright © 2011-2022 走看看