一个接口引发的反思

当时连续加班大概持续了三个周左右,最后几天写的接口,当时测试一切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));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值