redis解决并发注册生成唯一码

注册时分配用户唯一编号,容易产生并发,导致用户注册成功后登录退出的问题,考虑了第一种方式:给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);
        }

猜你喜欢

转载自blog.csdn.net/hechenhongbo/article/details/121927755