秒杀简单实现

秒杀的写法:文件锁,mysql锁,redis队列
流程:1、加锁
2、判断库存
3、秒杀处理
4、解锁
问题:高并发下,文件锁,mysql 锁都会产生卡锁现象,导致服务器崩溃,而redis队列也会偶发性出现超卖
解决办法:redis乐观锁,通过监视锁(key),原子执行
代码如下(简化):
 
include 'db.php';
 
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('123456');
 
$redis->watch('sales'); // 监视作用,监视一个或多个key,如果在事务执行之前被其他事件改动,则事务会被打断
 
// 获取销量
$sales = $redis->get('sales');
 
$sku = 5;
 
// 如果销量大于库存,则活动结束
if($sales >= $sku)
{
exit('活动结束');
}
 
$redis->multi(); // 事务,要么成功提交,要么不提交,被其他用户打断,提交失败
 
$redis->set('sales', $sales+1);
 
$res = $redis->exec(); // 事务提交
 
if($res)
{
$sql = "update products set sku = sku - 1 where id = 1";
if($db->exec($sql))
{
exit("减库存成功");
}
}

posted @ 2019-02-21 10:53  不二神探V  阅读(206)  评论(0编辑  收藏  举报