redis学习小记-分布式事务实现秒杀

1 篇文章 0 订阅
<?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/>';
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值