今天上面反应这样一个情况,后台看到有一个用户的电话存在6条重复的数据在用户列表,我立马查询了下数据库看到确实这个号码在用户表存在6条数据,而且注册时间是一模一样。
我先检查了下表里面电话这个字段是否设置了唯一索引
然后想了下通过redis 的队列应该可以限制一下这种情况的发生,大概思路是这样。
数据库存在多条数据肯定是存在多次请求,那么我在注册的方法里面第一步是利用redis的队列来检查上一次请求是否已完成,
首先检查队列里面指定的对象是否存在数据,如果存在则直接打回,如果不存在执行后续注册的逻辑处理,在注册完成之后将队列里面的数据出列,在下次请求时,数据库的电话字段已设置了唯一索引,而且在注册的时候,也会利用代码去检查数据库是否已存在改电话,这样处理之后我想应该能避免瞬时插入多条重复数据的情况发生。这是redis的简单队列代码:
$redis=new Redis();
$phone='xxx';//正在注册的手机号
//程序判断该手机号是否已注册,如已注册则终止
......
//进队列
$strQueueName='request_'.$phone;
$strCount = $redis->lrange($strQueueName, 0, -1);
if($strCount){
echo '请勿重复请求';die;
}
//入列一个数据标识
$redis->rpush($strQueueName, '1');
//处理注册的逻辑
//......
//注册成功
//出列
$redis->lpop($strQueueName);