>  기사  >  PHP 프레임워크  >  TP5는 Redis를 사용하여 전자상거래 플래시 판매를 처리합니다.

TP5는 Redis를 사용하여 전자상거래 플래시 판매를 처리합니다.

angryTom
angryTom앞으로
2020-03-13 10:33:534023검색

이 기사는 ThinkPHP가 Redis를 사용하여 전자상거래 플래시 판매를 구현하는 방법을 소개합니다. ThinkPHP를 배우는 친구들에게 도움이 되길 바랍니다.

TP5는 Redis를 사용하여 전자상거래 플래시 판매를 처리합니다.

TP5는 Redis를 사용하여 전자상거래 플래시 판매를 처리합니다

1. 먼저 TP5에서 스냅업 활동에 필요한 Redis 클래스 라이브러리 파일을 생성합니다.

<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()
 
        {
 
            //设置15天自动回收redis
 
            $this->setExpire((int);
 
$this>getScheduleCenter()->getInfoFieldValue("end_time")+3600*24*15);
 
        }
 
    }

2. 서비스 계층 또는 컨트롤러의 스냅업 로직, 코드는 다음과 같습니다.

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());
 
    }
 
}
 
}

처리 로직에서 구매 요청의 일부를 무작위로 제거하여 긴급 구매 활동이 원활하게 완료되도록 할 수 있습니다

Of 물론 프런트 엔드 요청에서도 유사한 필터링 방법을 동시에 사용할 수도 있습니다

타이밍 대기열을 참조하여 주문이 처리되었는지 확인할 수 있습니다. 남은 재고 보정을 완료하세요

(권장 튜토리얼: thinkphp) 튜토리얼)

위 내용은 TP5는 Redis를 사용하여 전자상거래 플래시 판매를 처리합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 www.yidianphp.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제