一个接口引发的反思
程序员文章站
2024-01-29 17:56:22
...
当时连续加班大概持续了三个周左右,最后几天写的接口,当时测试一切OK,昨天突然引起CPU飙升至100%,甚至引起了报警短信。
今天结合阿里云后台sql洞察,分析得知,一个用户提交新增接口,用到了insert-select,且前端没有友好提示重复提交,导致表锁死,引起CPU飙升差点出现宕机,还好阿里云的自恢复能力超高。
今天重新审视这个接口和表结构,哎呀,简直想去跳楼,当时怎么蒙的一批,竟然设计出这样的表和这样的接口,想哭…
回顾需求:用户可以【备份通讯录】,然后删除一些联系人,最后可以选择【恢复通讯录】,用户可备份N次,恢复的时候返回最后一次备份的数据给到前端即可
当时不知什么情况,竟然还设计了unique来作为每次提交导入的组标记,不忍直视。。。。。。
接口里面写的更是糟心,当时应当是考虑,用户提交的,有些需要更新,有些需要新增。。。
foreach ($phonelist as $k=>$v){
$v['member_id'] = $this->uid;
$v['unique'] = md5(json_encode($v));
$v['date'] = $date;
$is = Db::name('address_book')
->where('member_id',$v['member_id'])
->where('unique',$v['unique'])
->find();
if(empty($is)){
array_push($savelist,$v);
}else{
array_push($upids,$is['id']);
}
}
今天重新设计了表,简单直观,一个用户每次提交生成一条记录,用户需要恢复的通讯录,选择date最近的一行即可
public function backupBooks(){
$redis = new \Redis;
$redis->connect('127.0.0.1', '6379');
$redis->auth('*****');
//去除连续提交
$backupFlag = $redis->get('backupBooks_'.$this->uid);
if($backupFlag){
return json_encode(array('msg' => "请不要重复提交", 'code' => self::ERROR_NOTICE_CODE));
}
$redis->set('backupBooks_'.$this->uid,1,30);
//去除连续提交
$phone=input('post.phonelist');
$phonelist = json_decode(htmlspecialchars_decode($phone),true);
if(empty($phonelist)){
return json_encode(array('msg'=>self::NOT_REQUIRE_FIELD,'code'=>self::ERROR_NOTICE_CODE));
}
$d['member_id'] = $this->uid;
$d['phones'] = json_encode($phonelist);
$d['date'] = date("Y-m-d H:i:s");
$is = Db::name('phone_book')->where(['member_id'=>$d['member_id'],'phones'=>$d['phones']])->find();
if(empty($is)){
Db::name('phone_book')->insertGetId($d);
}else{
Db::name('phone_book')->where('id',$is['id'])->update(array('date'=>date("Y-m-d H:i:s")));
}
return json_encode(array('msg' => self::BACKUP_OK, 'code' => self::SUCCESS_OK_CODE));
}
public function recoverAddsBook(){
$info = Db::name('phone_book')->where(['member_id'=>$this->uid])->order('date desc')->find();
if(empty($info)){
return json_encode(array('msg'=>"您还没有备份过通讯录",'code'=>self::ERROR_NOTICE_CODE));
}
$phonelist = json_decode($info['phones'],true);
$msg = "成功恢复".count($phonelist)."条通讯录";
return json_encode(array('data' => $phonelist,'msg'=>$msg,'code' => self::SUCCESS_OK_CODE));
}
下一篇: 一个空格引发的“*“