Home > PHP Framework > ThinkPHP > TP5 uses Redis to handle e-commerce flash sales

TP5 uses Redis to handle e-commerce flash sales

angryTom
Release: 2020-03-13 10:33:53
forward
4149 people have browsed it

This article introduces how ThinkPHP uses Redis to implement e-commerce flash sales. It has certain reference value. I hope it will be helpful to friends who are learning ThinkPHP!

TP5 uses Redis to handle e-commerce flash sales

TP5 uses Redis to handle e-commerce flash sales

1. First, create the Redis class library file required for the rush sale activity in TP5 , the code is as follows:

<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);
 
        }
 
    }
Copy after login

2. Process the rush buying logic in the service layer or controller, the code is as follows:

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

In the processing logic, you can use randomly removed part of the purchase request to ensure the rush buying activity Smooth completion

Of course, you can also use a similar method to filter in the front-end request at the same time

You can refer to the timing queue to determine whether the order has been processed and calibrate the remaining inventory

(Recommended tutorial: thinkphp tutorial)

The above is the detailed content of TP5 uses Redis to handle e-commerce flash sales. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:www.yidianphp.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template