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

// 初始化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. TreeMap源码

    一.TreeMap简介 TreeMap是基于红黑树的java版实现,作者Josh Bloch and Doug Lea(这二人在java发展的早期做了重大贡献,比如集合框架JDK1.2.并发包JDK1 ...

  2. Golang 网络爬虫框架gocolly/colly 四

    Golang 网络爬虫框架gocolly/colly 四 爬虫靠演技,表演得越像浏览器,抓取数据越容易,这是我多年爬虫经验的感悟.回顾下个人的爬虫经历,共分三个阶段:第一阶段,09年左右开始接触爬虫, ...

  3. Cleaner, more elegant, and harder to recognize (msdn blog)

    It appears that some people interpreted the title of one of my rants from many months ago, "Cle ...

  4. Sublime Text 使用教程

    Sublime Text 是一款非常轻量级而且功能十分强大的编辑器,支持大量插件,深受前端开发者的喜爱.多的不说,我们直接进入正题. 1.下载 ①.官网下载地址:http://www.sublimet ...

  5. jQuery中事件对象e的事件冒泡用法示例(事件冒泡与阻止冒泡)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. c#中不同类中变量的引用方法

    (1)如果两个类没有继承关系,存取另一个类中变量的方法如下: public class A { // 注意: // Count是静态变量(static),称为类变量.类变量无需实例化即可使用 publ ...

  7. C#图解教程第一章 C#和.NET框架

    1.1 在.NET之前 C#发音:see shap 1.1.1 20世纪90年代后期的Windows编程  20世纪90年代后期各语言缺点:   1.纯Win32 API不是面向对象的,而且工作量比M ...

  8. sql sever基本查询语句

    查询(*可代表全部)(<>代表不等于于)select 列名 from 表名(,隔开)where 查询条件order by 排序的列名+连接的数据类型必须兼容(结果为字符串数据的连接 , 如 ...

  9. golang 多维数组

    具体的题目如下:(就是将多维数组的行列互换) A multi-dimensional array is an array of arrays. 2-dimensional arrays are the ...

  10. 使用Xamarin实现跨平台移动应用开发(转载)

    刚在朋友圈看到张善友,转发的一条分享“使用Xamarin实现跨平台移动应用开发”,写的确实很详细得体,从收费到开源,这段时间xamarin受到不少质疑,如此文http://blog.csdn.net/ ...