秒杀简单实现

mac2022-06-30  25

秒杀的写法:文件锁,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("减库存成功"); } }

转载于:https://www.cnblogs.com/bestvish/p/10411027.html

最新回复(0)