18720358503 在线客服 人才招聘 返回顶部
企业动态 技术分享 行业动态

TP5应用Redis解决一一样的限时抢购(限时秒杀)

2021-04-08分享 "> 对不起,没有下一图集了!">
91 php     namespace app\base\service;       use mikkle\tp_redis\RedisHashInfoBase;     use think\Exception;       class ScheduleDetail extends RedisHashInfoBase     {         protected $table="gopar_schedule_detail"; //数据信息表的         protected $pk = "id"; //数据信息表的主键             public function _initialize()         {             //分辨数据信息存有 并设定查验周期时间10分鐘             if (!$this- checkLock("dataExists") !$this- checkTableDataExists()){                 throw new Exception("有关商品数据信息不会有");             }else{                 //设定查验锁10分鐘                 $this- setLock("dataExists",600);             }             //假如数据信息不会有 原始化载入数据信息             if (!$this- checkExists()){                 $this- initTableData();             }         }             public function getScheduleCenter()         {             return Schedule::instance( $this- getInfoFieldValue("schedule_id"));         }             public function __destruct()         {             //设定半个月全自动收购redis             $this- setExpire((int); $this getScheduleCenter()- getInfoFieldValue("end_time")+3600*24*15);         }     }
5 public function index($data=["user_id"= 1,"ticket_detail_id"= 1,"buy_num"= 1]){     try {         //检验数据信息存有         if (!$this- checkArrayValueEmpty($data,["user_id","ticket_detail_id","buy_num"])){             throw new Exception($this- error);         }         $user_id= $data["user_id"] ; //客户Id         $ticket_detail_id = $data["ticket_detail_id"] ; //商品Id         $buy_num = $data["buy_num"] ; //选购总数         $infoCenter= ScheduleDetail::instance( $ticket_detail_id );         $scheduleDetailInfo =$infoCenter- getInfoList();         //改动数据信息库后 必须运作initTableData()方式再次原始化 强烈推荐提到Hook里      // $infoCenter- initTableData();         if ( $infoCenter- getInfoFieldValue( "hot_schedule")){             //受欢迎限时抢购任意过虑任意过虑             if (!in_array(rand(100, 200) % 11, [1, 3, 5, 7, 9])) {                 throw new Exception("抢票总数诸多 ,你被挤压限时抢购团队,也有余票,请再次再抢");             };         }         // 这儿分辨 选购总数和市场销售时间 不符合合就 throw new Exception         if (!true){             throw new Exception("这儿写不符合合缘故");         }         if (((int)$infoCenter- getInfoFieldValue("{$user_id}_num")+$buy_num) $scheduleDetailInfo["limit_num"] ){             throw new Exception("你超出较大选购总数");         }         if ($infoCenter- setInfoFieldIncre("pay_num",$buy_num) $scheduleDetailInfo["limit_num"] ){             //             $infoCenter- setInfoFieldIncre("pay_num", -$buy_num);             throw new Exception("抱歉,票早已卖光了!");         }         //这儿写主逻辑性 开启事务管理作用建立定单         //事务管理参照下节源代码         //升級已市场销售总数         $infoCenter- updateTableData(["pay_num"]);         //在这里里强烈推荐埋勾子 解决定单进行的事后事儿          //回到結果     } catch (Exception $e) {         Log::error($e- getMessage());         return ShowCode::jsonCodeWithoutData(1008, $e- getMessage());     } } }
在解决逻辑性中 可使用任意除去了一一部分的选购恳求 以确保限时抢购主题活动安稳进行
自然还可以同时在前端开发恳求中实例相近方式过虑
"> 对不起,没有下一图集了!">
在线咨询