溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

thinkphp中怎么利用redis實現(xiàn)秒殺緩存功能

發(fā)布時間:2021-07-09 16:57:14 來源:億速云 閱讀:269 作者:Leah 欄目:大數(shù)據(jù)

thinkphp中怎么利用redis實現(xiàn)秒殺緩存功能,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

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ò)展是否成功安裝

thinkphp中怎么利用redis實現(xiàn)秒殺緩存功能

在config配置redis 我示例用的是thinkphp5.0

thinkphp中怎么利用redis實現(xiàn)秒殺緩存功能

然后在extend下新建module文件夾 創(chuàng)建Redis.php文件

<?php
/**
 * Created by PhpStorm.
 * User: lhl
 * Date: 2018/8/20
 * Time: 下午1:52
 */

namespace module;


class Redis extends \Redis
{
    public static function redis() {
        $con = new \Redis();
        $con->connect(config('redis.host'), config('redis.port'), 5);
        return $con;
    }
}

在thinkphp文件下的helper.php加入


if (!function_exists('redis')) {
    /**
     * 獲取容器對象實例
     * @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);//記錄秒殺失敗日志
            }
        }
    }

    // 將商品庫存存入隊列
    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)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI