十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
thinkphp中怎么利用redis實(shí)現(xiàn)秒殺緩存功能,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元朔州做網(wǎng)站,已為上家服務(wù),為朔州各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220
1,安裝redis,根據(jù)自己的php版本安裝對應(yīng)的redis擴(kuò)展
首先查看phpinfo();php環(huán)境信息
2,下載redis
https://windows.php.net/downloads/pecl/snaps/redis/ https://windows.php.net/downloads/pecl/releases/igbinary/
一定要確認(rèn)下載版本是否和php對應(yīng)
3.解壓縮后,將php_redis.dll和php_redis.pdb拷貝至php的ext目錄下
4.修改php.ini,(PS:此php.ini文件是在Apache目錄)在該文件中加入:
; php_redis extension=php_igbinary.dll extension=php_redis.dll
注意:extension=php_igbinary.dll一定要放在extension=php_redis.dll的前面,否則此擴(kuò)展不會生效
5.重啟Apache后,使用phpinfo查看擴(kuò)展是否成功安裝
在config配置redis 我示例用的是thinkphp5.0
然后在extend下新建module文件夾 創(chuàng)建Redis.php文件
connect(config('redis.host'), config('redis.port'), 5); return $con; } } 在thinkphp文件下的helper.php加入 if (!function_exists('redis')) { /** * 獲取容器對象實(shí)例 * @return Container */ function redis() { return \module\Redis::redis(); } } 然后就可以在控制器寫redis緩存方法了 //創(chuàng)建redis緩存 \Cache::store('redis')->set(key, value); //讀取緩存 \Cache::store('redis')->get(key);
秒殺的核心問題是在大并發(fā)的情況下不會超出庫存的購買,這個就是處理的關(guān)鍵所以思路是第一步在秒殺類的先做一些基礎(chǔ)的數(shù)據(jù)生成:
三張表做測試,分別是:商品表,日志表,訂單表,
///秒殺入口
public function insva(){ $id = input('id');//獲取商品id if(!$id){ return $this->insertlog(0);//記錄失敗日志 } $redis = $this->redis();//接入redis $count = $redis->reduceStock('goods_stock');//減少庫存,返回剩余庫存 if($count ==0){ $this->insertlog(0);//記錄秒殺失敗日志 return false; }else{ $order = $this->build_order_no();//隨機(jī)生成訂單號 $status = 1; $data = db('goods')->where('id',$id)->find(); if (!$data){ return $this->insertlog(0);//商品不存在 } $res = db('order')->insert(['order_sn'=>$order,'uid'=>$this->user_id,'goods_id'=>$id]);//插入訂單 $stock = db('goods')->where('id',$id)->setDec('count');//減少庫存 if($stock){ $this->insertlog();//記錄成功日志 }else{ $this->insertlog(0);//記錄秒殺失敗日志 } } } // 將商品庫存存入隊(duì)列 public function redisinit(){ $store=50; // 庫存50 $redis=$this->redis(); //接入redis $redis->del('goods_store'); // 刪除庫存列表 $res=$redis->llen('goods_store'); //返回庫存長度,這里已經(jīng)是0 $count=$store-$res; for($i=0;$i<$count;$i++){ $redis->lpush('goods_store',1); //列表推進(jìn)50個,模擬50個商品庫存 } } //生成唯一訂單 function build_order_no(){ return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8); } // 記錄日志 狀態(tài)1成功 0失敗 function insertlog($status=1){ return Db::name("ab_log")->insertGetId(["count"=>1,"status"=>$status,"addtime"=>date('Y-m-d H:i:s')]); }
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。