## 高并发商品秒杀情况下,如何防止库存超支? > 1. 使用MYSQL悲观锁(容易死锁)或者乐观锁。 > 2. 消息队列解决 > 3. REDIS分布式锁 ### 1. REDIS分布式锁 > 分布式锁具有 **排他性**、**避免死锁** 等特性 > **SETNX (排他性)** :Not Exists (只有该key不存在,才能设置成功) > **SETEX (避免死锁)** :EXPIRE(设置该KEY过期时间,防止死锁问题) > 因为 SET 命令可以通过参数来实现和 SETNX 、 SETEX 结合命令效果 > SET mykey "value" NX EX 10 ~~~ public function test() { $result = $this->checkManyCommitByRedis('test_commit'.$uid); //防止高并发 if ($result == false) { exit('不要频繁操作哟'); } // TODO.... // 成功后切勿不要释放该锁,不然会引发TODO...流程中执行过长时间(锁失效),下一个请求来了加锁后,上一个请求成功执行释放锁,就影响了下一个请求的正常逻辑 } // 防止用户频繁提交 function checkManyCommitByRedis($key,$set_redis_time=3) { if (!\Yii::$app->redis->set($key,1,['NX', 'EX' => $set_redis_time])) {//key存在 return false; } return true; } ~~~