注册时分配用户唯一编号,容易产生并发,导致用户注册成功后登录退出的问题,考虑了第一种方式:给redis队列中放入一千条数据,这样每注册一个就从队列中弹出一个,数据不够了再取,最后同事提出了redis数据加锁的方法,试了一下,果然有效果,就用第二种了。 方式一:加队列 // $redis = \Yii::$app->redis; // $no_queue_key = 'user_no_list'; // $getnoListRedis = $redis->rpop($no_queue_key); // if(empty($getnoListRedis)){ // $no = Nodata::find()->where(['uid' => 0])->limit(1000)->all(); // foreach($no as $_v){ // $res = $redis->lpush($no_queue_key,$_v->no); // } // $getnoListRedis = $redis->rpop($no_queue_key); // } //dd($getnoListRedis); 方式二:当前数据加redis锁 // 循环取no while($no = No::find()->where(['uid' => 0])->limit(1)->one()){ $key = 'allocateNo:lockKey:'. $no->id; // 如果上锁成功,取到数据,退出循环 if(\Yii::$app->redis->setnx($key,'1')){ //确定没锁后先赋值redis,锁上先 \Yii::$app->redis->expire($key, 30); //设置锁的时间,具体看自己的业务场景,一般一个接口请求不超过60秒 break; } // 否则等 100 毫秒 usleep(100); }
redis解决并发注册生成唯一码
猜你喜欢
转载自blog.csdn.net/hechenhongbo/article/details/121927755
今日推荐
周排行