项目注册高并发引起注册编号重复问题解决。


项目开发的时候,开发注册模块要生成一个唯一的注册编号,编号的生成规则为日期+当天注册数。为了解决并发注册会引起注册编号重复的问题就运用的redis的锁机制来解决这个问题。

<?php
$redis
= new Redis(); while ($redis->setnx('lock', time() + 2) == 0) {//加锁成功并设置超时防止死锁,setnx当值已经存在则不操作返回0,当值不存在则set值并返回1. if (time() > $redis->get('lock') && time() > $redis->getSet('lock', time() + 2)) {//若加锁不成功则判断该锁是否已经超时,则用getset函数获取旧值是否真的超时并设置新的超时值。跳出循环执行业务逻辑代码。 break; } else { //建议用swoole的协程来处理会更加提高性能 sleep(1); }
}
//进行业务逻辑代码
//释放redis
$
redis->del('lock');
注意:用getset函数而不直接用set函数是防止两个用户同时进到循环设置锁的超时时间,就会发生并发的问题,用getset就保证只有一个用户加锁成功。

拿不到锁的用户就只能等待,或者直接报错重新操作也是可以的。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM