$redis = new Redis();
try {
$redis->connect('127.0.0.1', 6379);
// 监视key
$redis->watch('Stock'); //监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
$sales = $redis->get('Stock');
$kucun = 10; //数据库表里的商品库存数量
if($sales >= $kucun){
exit('秒杀结束');
}
//开启redis事务块
$redis->multi(); //事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。
$redis->set('Stock',$sales+1);
$res = $redis->exec();
if($res){
include 'db.php';
$sql = "update products set stock=stock-1 where id=1";
if($pdo->exec($sql)){
echo '完成';
}
}
} catch (Exception $e) {
echo '连接失败';
}
本文介绍了一种利用Redis的事务特性实现商品库存秒杀的方法。通过监视库存键并在事务中更新,确保了操作的原子性和一致性,防止了超卖现象。同时,详细展示了如何在事务成功后更新数据库中的库存。
618

被折叠的 条评论
为什么被折叠?



