<?php
// 抢购之前需要先设置商品库存,清空旧的用户购买数据
// set goodsSku_1000 2
// set goodsSku_2000 1
$maxOfEveryUser = 1; // 每人最大上限
$file = './tmp/log.txt'; // 用文件记录接口调用过程
// 模拟用户和商品id
$user = ['Jay', 'Jack', 'Tom','Jay', 'Jack', 'Tom','Jay', 'Jack', 'Tom'][rand(0, 8)];
$index = rand(0, 1);
$goodsId = [1000, 2000][$index];
$good = ['华为p30', 'macbook'][$index];
$redis = new Redis();
$redis->connect('redis', 6379);
// 每个商品的库存key
$goodsSkuKey = "goodsSku_{$goodsId}";
if ($redis->get($goodsSkuKey) <= 0) {
$msg = "商品{$good}库存为0,{$user}:抢购失败";
file_put_contents($file, $msg . PHP_EOL, FILE_APPEND);
echo $msg . '<br/>';
exit;
}
// 每个用户购买的某个商品数量
$userGoodsKey = "user_{$user}_{$goodsId}";
$userGoodsCount = $redis->get($userGoodsKey);
if ($userGoodsCount === false) {
$redis->set($userGoodsKey, 0);
} else if ($userGoodsCount >= $maxOfEveryUser) {
$msg = "用户{$user}已购买{$good},数量为:{$userGoodsCount},超过最大数量{$maxOfEveryUser},抢购失败";
file_put_contents($file, $msg . PHP_EOL, FILE_APPEND);
echo $msg . '<br>';
exit;
}
$redis->watch($goodsSkuKey, $userGoodsCount);
$redis->multi();
$msg = "{$user}正在排队购买商品:{$good}";
file_put_contents($file, $msg . PHP_EOL, FILE_APPEND);
echo $msg . '<br/>';
$redis->lpush("{$goodsId}_users", $user);
$redis->decr($goodsSkuKey);
$redis->incr($userGoodsKey);
$res = $redis->exec();
if ($res) {
$msg = "{$user}抢购{$goods}成功";
file_put_contents($file, $msg . PHP_EOL, FILE_APPEND);
echo $msg . '<br/>';
} else {
$msg = "{$user}抢购{$goods}失败";
file_put_contents($file, $msg . PHP_EOL, FILE_APPEND);
echo $msg . '<br/>';
}
redis学习小记-分布式事务实现秒杀
最新推荐文章于 2022-09-16 16:08:46 发布