TP5使用Redis處理電商秒殺


本篇文章介紹了ThinkPHP使用Redis實現電商秒殺的處理方法,具有一定的參考價值,希望對學習ThinkPHP的朋友有幫助!

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

  

    }

  

}

  

}

  

在處理邏輯中 可以使用隨機去除了一部分的購買請求 以保證搶購活動平穩完成

當然也可以同時在前端請求中示例類似方法過濾

可以參照定時隊列判斷訂單是否處理完成 校准剩余庫存

推薦教程

基礎:

手把手教你寫留言板系統av78744637

HTML+PHP+Mysql實現網站注冊登錄av78785761

php從零教學支付技術大通關Av78773453

零基礎小白兩小時入門PHP基礎語法av81031138

兩小時熟練PHP基礎語法八大數據類型av81050275

PHP黃金搭檔mysql數據庫兩小時基礎入門av81142395

PHP微信掃碼支付從入門到實戰av83815575

PHP微信支付從入門到實戰教程av83707632

教你如何用laravel開發支付寶接口av77424057

php擴展開發:

PHP擴展開發——cookie與session原理實戰av83825917

php擴展開發——驗證碼開發av83864077

 

tp:

TP5開發大型ERP核心系統Auth認證組件av80969844

女神老師講解thinkphp6支付大通關av79763622

 

redis:

redis從入門到精通實戰教程av83679805

9年架構師教你用redis實現高並發限流av94478592

9年架構師教你用redis實現高並發秒殺av94926372

9年架構師講解redis高並發秒殺解決方案av95010886

 

swoole:

PHP—swoole通往大神修煉之路:av77924246

手把手教你用swoole+websocket實現戶外監控直播(總集篇):av79087951

教你用swoole開發網絡游戲:av79264440

PHP高級技術手寫swoole分布式框架:av78383962

PHP高級技術手寫swoole分布式框架(二):av78632435

PHP高級技術手寫swoole分布式框架(三):av78748923

PHP高級技術手寫swoole分布式框架(框架優化):av78856427

PHP高級技術手寫swoole分布式框架(分布式RPC):av79012272

用swoole實現消息推送:av79874641

swoole+docker+redis主從復制及讀寫分離av78781841

加薪、漲分利器-Swoole-Go協程+Mysql8.0實現高性能數據庫連接池:av93991412

 

更多學習內容請訪問:

怎么從一名碼農成為架構師的必看知識點:目錄大全(不定期更新)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM