如题,废话少说贴码为上↓

// 初始化redis数据列表 模拟库存50,redis搭建在centos中已开启
public function redisinit(){ $store=50; // 库存50
$redis=$this->redis(); //接入redis
$redis->del('goods_store'); // 删除库存列表
$res=$redis->llen('goods_store'); //返回库存长度,这里已经是0
$count=$store-$res;
for($i=0;$i<$count;$i++){
$redis->lpush('goods_store',1); //列表推进50个,模拟50个商品库存
} }
// 秒杀入口
public function kills(){
$id = input("id"); //商品编号
if(!$id)
return $this->insertlog(0);//记录失败日志
$redis = $this->redis(); // 接入redis
$count=$redis->lpop('goods_store'); //减少库存,返回剩余库存数
if(!$count){ //库存为0
$this->insertlog(0); //记录秒杀失败的 日志
return false;
}else{// 有库存
$ordersn = $this->build_order_no(); //订单号随机生成
$uid = rand(0,9999); //用户id随机生成,正式项目可以启用登录的session
$status = 1; // 订单状态
$data = Db::name("ab_goods")->field("count,amount")->where("id",$id)->find();//查找商品
if(!$data)
return $this->insertlog(0); //商品不存在
$result = Db::name("ab_order")->insert(["order_sn"=>$ordersn,"user_id"=>$uid,"goods_id"=>$id,"price"=>$data['amount'],"status"=>$status,'addtime'=>date('Y-m-d H:i:s')]); //订单入库
$res = Db::name("ab_goods")->where("id",$id)->setDec("count"); //库存减少
if($res)
$this->insertlog(); //记录成功的日志
else
$this->insertlog(0);//记录失败的日志 }
} //生成唯一订单
function build_order_no(){
return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
} // 记录日志 状态1成功 0失败
function insertlog($status=1){
return Db::name("ab_log")->insertGetId(["count"=>1,"status"=>$status,"addtime"=>date('Y-m-d H:i:s')]);
}

使用apache压力测试工具AB抢购商品

AB压力测试,模拟多用户秒杀商品
-r 指定接收到错误信息时不退出程序
-t 等待响应的最大时间
-n 指定压力测试总共的执行次数
-c 用于指定压力测试的并发数
例:秒杀商品,60秒内发起3000个请求,并发600次,接口地址 http://192.168.0.20:86/api/kill/kills/id/1
D:\wamp64\bin\apache\apache2.4.23\bin>ab -r -t 60 -n 3000 -c 600 http://192.168.0.20:86/api/kill/kills/id/1
正常的逻辑写法秒杀开始时候库存会出现负数

命令行:D:\wamp64\bin\apache\apache2.4.23\bin>ab -r -t 60 -n 1000 -c 100 http://192.168.0.20:86/api/kill/kills/id/1
60秒内发起1000个请求,并发100次,秒杀50个库存的商品,库存出现负数(-53),订单有103个!不测不知道,一测吓一跳~ 正常来说50个库存只会生成50个订单,在高并发下测试就懵逼了!

  

用法:

1.先跑一波库存接口(初始化50个库存):http://192.168.0.20:86/api/kill/redisinit

2 命令行:D:\wamp64\bin\apache\apache2.4.23\bin>ab -r -t 60 -n 1000 -c 100 http://192.168.0.20:86/api/kill/kills/id/1

3.如果ab测试中出现错误,该计算机关闭连接 Test aborted after 10 failures  apr_socket_con等错误请优化apache服务器,或者如下操作

、停止Apache服务;
、找到apache/conf/httpd.conf文件,用文本编辑器打开找到这两行:
# Server-pool management (MPM specific)
# Include conf/extra/httpd-mpm.conf
把第二行include........这行的注释去掉。 、找到apache/conf/extra/httpd-mpm.conf文件,打开,找到: <IfModule mpm_winnt_module>
ThreadsPerChild
MaxRequestsPerChild
</IfModule> 把上面的150调大,Windows下最大为1920.
注意:尖括号里的名字是winnt,不要看错了

centos6.5安装redis指南 http://www.cnblogs.com/leisir/p/8250840.html

如图

运行问cmd命令后再来看看数据库

ab_goods 库存数量count此时已经是0

ab_order 订单表已经有了50个订单

ab_log 日志表中有1000条记录,其中50条成功的,950条抢购失败的记录

表3张 商品 订单 日志 ab_goods ab_order ab_log

CREATE TABLE `ab_goods` (
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`count` int() NOT NULL DEFAULT '',
`status` tinyint() DEFAULT NULL,
`title` varchar() DEFAULT NULL,
`amount` decimal(,) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8; CREATE TABLE `ab_log` (
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`addtime` datetime DEFAULT NULL,
`status` tinyint() DEFAULT NULL,
`count` int() unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8; CREATE TABLE `ab_order` (
`id` int() unsigned NOT NULL AUTO_INCREMENT,
`order_sn` varchar() NOT NULL,
`user_id` int() NOT NULL,
`goods_id` int() NOT NULL,
`price` decimal(,) NOT NULL,
`status` tinyint() DEFAULT '',
`addtime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8;

thinkphp5使用redis实现秒杀商品活动的更多相关文章

  1. .NetCore+Jexus代理+Redis模拟秒杀商品活动

    开篇叙 本篇将和大家分享一下秒杀商品活动架构,采用的架构方案正如标题名称.NetCore+Jexus代理+Redis,由于精力有限所以这里只设计到商品添加,抢购,订单查询,处理队列抢购订单的功能:有不 ...

  2. thinkphp5.0 - Redis 实现秒杀

    首先,因为秒杀这个环节在商城项目中比较常见,最近写商城项目,碰到这个功能模块,于是就拿出来给大家分享一波. 难点:高并发的情况下,正常逻辑写的话数据库的库存会出现负数,对付这类问题有很多解决方案,我就 ...

  3. redis实现秒杀demo

    代码 package com.prosay.redis; import java.util.List; import redis.clients.jedis.Jedis; import redis.c ...

  4. IDEA SpringBoot+JPA+MySql+Redis+RabbitMQ 秒杀系统

    先放上github地址:spike-system,可以直接下载完整项目运行测试 SpringBoot+JPA+MySql+Redis+RabbitMQ 秒杀系统 技术栈:SpringBoot, MyS ...

  5. PHP 使用redis实现秒杀

    PHP 使用redis实现秒杀 使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用(mysql事务在高并发下性能下降很厉害,文件锁的方式也是) 先将商品库存如队 ...

  6. thinkphp5使用redis

    1.设置应用配置文件config.php type可以是很多分类File.Redis等等 2.thinkphp5使用redis新建application/index/controller/index. ...

  7. 39、生鲜电商平台-redis缓存在商品中的设计与架构

    说明:Java开源生鲜电商平台-redis缓存在商品中的设计与架构. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc ...

  8. 扩展thinkphp5的redis类方法

    笔者在开发时发现,thinkphp5的自带redis类方法,只有简单的读取缓存.写入缓存的基本方法,远不能满足我们业务的需求.redis本身支持五种数据类型,string(字符串).hash(哈希). ...

  9. Java生鲜电商平台-redis缓存在商品中的设计与架构

    Java生鲜电商平台-redis缓存在商品中的设计与架构 说明:Java开源生鲜电商平台-redis缓存在商品中的设计与架构. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而 ...

随机推荐

  1. Java_Date_02_截断日期到日

    oracle 的 trunc 函数能很方便的将日期截断.现在有个需求,需要用java实现与 oracle 的 trunc 函数 相同的功能. 1.需求:将日期截断到日 即 将格式为 2018-01-0 ...

  2. 鸟哥的linux私房菜学习-(二)VMware虚拟机及linux系统安装过程

    一.安装虚拟机 1.虚拟机常用版本及注册码地址:https://pan.baidu.com/s/1dFnkBrN#list/path=%2FSoftware%20Big%2FVMware%20Work ...

  3. js解析xml浏览器兼容性处理

    /****************************************************************************** 说明:xml解析类 ********** ...

  4. XUL透明异形旋转窗体

    200行不到的代码,实现透明异形旋转窗体. 下载(25MB): http://oltag.com:8080/yaolixing/18/11/00/OHUIv52.0.1_3_webTrans20180 ...

  5. 对比Tornado和Twisted两种异步Python框架

    做Python的人,一定知道两个性能优秀的异步网络框架:tornado,和twisted. 那么,这两个著名的框架,又有什么异同呢?tornado和twisted,我都用在几个游戏项目中,做过后端,觉 ...

  6. 工作流调度器azkaban(以及各种工作流调度器比对)

    1:工作流调度系统的作用: (1):一个完整的数据分析系统通常都是由大量任务单元组成:比如,shell脚本程序,java程序,mapreduce程序.hive脚本等:(2):各任务单元之间存在时间先后 ...

  7. VSCode好用的Python插件及配置

    MS Python插件. 这是微软官方的Python插件,已经自带很多功能.下面是插件功能描述,其中部分内容我做了翻译. a)        Linting (Prospector, Pylint,  ...

  8. 【vue系列之三】从一个vue-pdf-shower,说说vue组件和npm包

    前言 从去年年初开始,自己便下决心要写一个vue系列的博客,但时至今日,才写系列的第三篇博客,想来甚是惭愧. 但是慢归慢,每一篇都要保证质量,以及要写出自己的心路历程,防止自己工作中填的坑再让读者走一 ...

  9. [搬运] 写给 C# 开发人员的函数式编程

    原文地址:http://www.dotnetcurry.com/csharp/1384/functional-programming-fsharp-for-csharp-developers 摘要:作 ...

  10. Smart-image通过SoftReference提高性能

    文章导读: 文件介绍了常见的图片下载开源插件smart-image, 由于移动设备硬件受限,因此Android的相关app都要考虑到性能的关系, 所以很多的第三方插件都使用到了缓存cache技术,本人 ...