题目要求:1.后台添加一个秒杀商品以及商品库存
2.前台设计秒杀页面(商品详情页展示商品并且展示库存)
3并发测试库存不会出现负数,使用ab.exe实现压力测试,要求并发数不少于150
思路:
//商品添加
视图:表单,商品名称,商品库存,商品价格,提交,保存到数据库
实例redis,
for(循环次数是商品库存){
把1添加到goods+id这个key里,
}
添加成功
//列表展示
商品名称,库存,秒杀按钮
秒杀按钮的连接到秒杀方法,带参数商品id
//秒杀
接收商品id
实例redis,$count=redis->lpop(goods+id);
if(!$count){
echo 库存不足;
}
修改数据库,把该商品库存减掉对应数量
接下来进入正题,后台页面添加数据以及展示页面就不写了比较简单,直接写控制器
<?php
namespace backend\controllers;
use Yii;
use yii\web\Controller;
header('Content-Type: text/html; charset=utf-8');
class MiaoshaController extends Controller{
//公共页面
public $layout='mie';
public function actionAdd()
{
if(yii::$app->request->isPost)
{
$goods_name=yii::$app->request->post('goods_name');
$num=yii::$app->request->post('num');
$goods_price=yii::$app->request->post('goods_price');
$res = \Yii::$app->db->createCommand()->insert('nail_m_goods', [
'goods_name' => $goods_name,
'num' => $num,
'goods_price'=>$goods_price
])->execute();
$goods_id=Yii::$app->db->getLastInsertID();
if($res)
{
for($i=0;$i<$num;$i++)
{
$redis=yii::$app->redis;
// var_dump($redis);die;
//将一个或多个值插入到列表头部
$redis->lpush("nail_m_goods:".$goods_id,1);
}
return $this->redirect('?r=miaosha/show');
}else{
echo "添加失败";
}
}else{
return $this->render('add');
}
}
public function actionShow()
{
$command = \Yii::$app->db->createCommand('SELECT * FROM nail_m_goods');
$data = $command->queryAll();
return $this->render('show',['data'=>$data]);
}
public function actionMiao()
{
$goods_id=11;
$command = \Yii::$app->db->createCommand("SELECT * FROM nail_m_goods WHERE goods_id=$goods_id");
$post = $command->queryOne();
$num=$post['num'];
$redis=yii::$app->redis;
//移出并获取列表的第一个元素
$date=$redis->lpop("nail_m_goods:".$goods_id);
if($date)
{
$res = \Yii::$app->db->createCommand()->update('nail_m_goods', ['num'=>$num-1],["goods_id" => $goods_id])->execute();
echo "秒杀成功";
}else{
echo "秒杀失败,没有库存";
}
}
}
?>
好了接下来就是添加商品以及库存,然后打开redis-server.exe开启redis,看RedisDesktopManager内部有没有存储,然后打开cmd 输入ab.exe -n 200 -c 100 (输入ab.exe所在的地址),看数据库里库存有没有减少,若减少就是成功了