欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一个接口引发的反思

程序员文章站 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));
    }
相关标签: 五味杂陈还是甜