前兩天想自己研究PHP的並發問題,看到很多人都說用redis的隊列處理並發很好,所以自己也去研究了一下,下面用實際項目記錄一下自己的成果。
基本思路是所有操作用過redis的隊列和集合處理並發
1.用戶搶購隊列(List),user_list
2.商品隊列(List),goods_list
3.訂單信息(Hash集合),order_info
4.購買成功用戶(Set集合),bought_list
PS:1和2用來控制並發,隊列的rPop是具有原子性的,即使處理並發,也是一個個處理,不會出現重復和超賣的情況。
3則是用來暫時存放訂單信息,之后再入庫。
4是為了防止用戶重復購買做的(Set的特性是不能重復)。
並發模擬則是在Linux的webbench做的。
經過試驗發現,並發1000條的搶購,直接操作數據庫要12秒,使用redis只要6秒,速度快了整整一倍!
下面貼源碼
商品入貨1000個:
public function ruhuo(){ $redis = new \redis(); $redis->connect('127.0.0.1', 6379); for($i = 1;$i<=1000;$i++) $redis->lpush('goods_list',$i); echo '進貨成功'; }
秒殺接口:
public function redis_qianghuo(){ $redis = new \redis(); $redis->connect('127.0.0.1', 6379); //查詢庫存 if($redis->lLen('goods_list') == 0) $this->ajaxReturn('商品已售完...'); $uid = $_SERVER['REMOTE_PORT']; //查詢是否購買過 if($redis->sIsMember('bought_list',$uid)) $this->ajaxReturn('你已經購買過了!'); $goods_id = $redis->rpop('goods_list'); $redis->sAdd('bought_list',$uid); $value = array( 'uid' => $uid, 'goods_id' => $goods_id, 'time' => time(), ); $redis->hSet('order_info',$uid,json_encode($value)); $this->ajaxReturn('購買成功。'); }
就是這么簡單,不僅高效,而且不會出現超賣情況,很實用的並發處理。
---------------------
作者:Me佳佳丶
來源:CSDN
原文:https://blog.csdn.net/q6627666/article/details/78364599
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
