php+redis+TP處理並發


前兩天想自己研究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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

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



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