1、修改routes\web.php
路由文件
// 模拟秒杀
Route::get('/init', 'RedisController@index');
Route::get('/start', 'RedisController@start');
Route::get('/show', 'RedisController@result');
2、创建控制器,代码部分转自http://www.likecs.com/show-19549.html
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Redis;
class RedisController extends Controller
{
// 允许进入队列的人数
public $user_number = 50;
/**
* 初始化
*/
public function index()
{
// 商品库存
$goods_number = 10;
if(!empty(Redis::llen('goods_name'))) {
echo '已经设置了库存';
exit;
}
// 初始化缓存
Redis::command('del', ['user_number', 'success']);
// 将商品存入Redis链表中
for($i = 1; $i <= $goods_number; $i++) {
Redis::lpush('goods_name', $i);
}
// 设置过期时间
Redis::expire('goods_name', 120);
echo '商品存入队列成功,数量:'.Redis::llen('goods_name');
}
/**
* 抢购操作
*/
public function start()
{
// 模拟随机登录用户
$uid = mt_rand(1, 99);
if(Redis::llen('user_number') > $this->user_number) {
echo '遗憾,已经被抢光了';
exit;
}
$result = Redis::lrange('success', 0, 20);
if(in_array($uid, $result)) {
echo '你已经抢过了';
exit;
}
$count = Redis::lpop('goods_name');
if(!$count) {
echo '被抢光了';
exit;
}
$msg = '抢到的人为:'.$uid.',商品为:'.$count;
Redis::lpush('success', $msg);
echo '恭喜你抢到了';
}
/**
* 显示抢购结果
*/
public function result()
{
$result = Redis::lrange('success', 0, 20);
dd($result);
}
}
P.S.问题点:由于昨天我安装YugaByte DB导致今天的Redis无法正常使用,经过调查是因为YugaByte DB占用了6379
这个端口号,因此我需要修改Redis.conf
配置文件,创建新的端口号防止冲突,然后执行./src/redis-server ./redis.conf
即可。
3、测试秒杀功能
先执行http://localhost:8888/init来初始化商品
然后找到ab测试工具,在命令行中输入./ab -n 50 -c 50 http://localhost:8888/start
来实现并发操作,其中-n
表示总请求数量,-c
表示并发数量
运行结果如下:
最后在浏览器中输入http://localhost:8888/show来查看结果
array:10 [0 => "抢到的人为:92,商品为:1"
1 => "抢到的人为:15,商品为:2"
2 => "抢到的人为:50,商品为:3"
3 => "抢到的人为:39,商品为:5"
4 => "抢到的人为:99,商品为:4"
5 => "抢到的人为:12,商品为:6"
6 => "抢到的人为:71,商品为:7"
7 => "抢到的人为:29,商品为:8"
8 => "抢到的人为:85,商品为:9"
9 => "抢到的人为:39,商品为:10"]
P.S.由于系统安装的MAMP中包含的ab压力测试工具的限制无法测试太多的请求数量,该例子只是最为一个范例,如果实际需要测试大并发量的话,请自行下载apache
来解决ab
限制的问题。