本篇文章介紹了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=https://www.cnblogs.com/a609251438/p/["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
更多學習內容請訪問:
怎么從一名碼農成為架構師的必看知識點:目錄大全(不定期更新)?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/75607.html
標籤:PHP
上一篇:PHP獲取本周、上周、本月、上月、本季度、上季度等各類具體時間
下一篇:關于PHP命名空間的討論
