实现的方式是用的redis的list队列,框架为laravel
核心部分为list的pop操作,此操作为原子性,即使很多用户同时到达,也是依次执行
<?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']);
for ($i = 1; $i <= $goods_number; $i++) {
Redis::lpush('goods_name', $i);
}
$this->setTime();
echo '商品存入队列成功,数量:'.Redis::llen('goods_name');
}
public function setTime()
{
Redis::expire('goods_name', 120);
}
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;
}
Redis::lpush('user_number', $uid);
$count = Redis::lpop('goods_name');
if (! $count) {
echo '被抢完了';
exit;
}
$msg = '抢到的人为:'.$uid.',商品ID为:'.$count;
Redis::lpush('success', $msg);
echo '公司拟,抢到了';
}
public function result()
{
$result = Redis::lrange('success', 0, 20);
dd($result);
}
}