redis實現購物車

購物車管理包含功能:提交商品到購物車、顯示購物車列表、刪除購物車裏商品、修改購物車、清空購物車等等

1、 購物車的實現方式:
① 可以把購物車的數據,給存儲到 session 裏面,一旦關閉瀏覽器,則商品數據就丟失;
②可以把購物車的數據,給存儲到 cookie 裏面,可以長久的保存購物車裏面的數據;
③可以把購物車的數據,給存儲到數據庫裏面,可以長久的保存購物車裏面的數據;
④可以把購物車的數據,給存儲到緩存裏(memcache,redis),也可以長久的保存購物車的數據。

注:Session 可能會引起併發問題,如果腳本很短,這通常沒有問題。但如果腳本運行時間比較長,那就可能會產生問題。在現代 Web 應用程序開發中,有一個非常常見的情況,就是使用 AJAX 技術在同一個頁面內發送多個請求獲取數據。

如果這些請求都需要使用Session,那麼第一個請求到達服務器後會取得 Session 鎖,其它請求就必須等待,所有請求將串行處理,即使它們彼此之間並沒有依賴關係。這將大大增加頁面的響應時間。

有一個方法可以避免這個問題,就是在使用完 Session 以後立即調用 session_write_close()方法關閉 Session。這樣 Session 鎖就會釋放,即使當前腳本還在等在處理。需要注意的是,調用該方法後,當前腳本就不能進一步操作 Session 了

2、實例:京東購物車的設置,如果用戶已經登錄,則把購物車數據保存到數據庫裏面,如果沒有登錄,則把購物車的數據給保存到 cookie 裏面,當登錄時,要判斷 cookie是否有購物車的數據,如果有,則把 cookie 裏面的數據給移動到數據庫裏面。

3、提交商品到購物車:在前臺模塊裏新建一個 CartController 控制器,添加 addCart方法

實現代碼

<?php
namespace app\index\controller;

use think\Controller;
use think\Validate;

class Cart extends Controller
{
    private $redis = null;
    public function __construct()   //可以使用單例模式
    {
        $this->redis = new \Redis();
        $this->redis->connect('127.0.0.1','6379');
    }

    public function index()
    {
        $data = $_POST;

        //1.添加購物車操作測試
      /*  $rule0 = [
            'userid'=> "require|number",
            'goodid'=> "require|number",
            'goodname'=>"require"
        ];
        $validate = new Validate($rule0);
        if ($validate->check($data)){
            $userid = $_POST['userid'];
            $goodid = $_POST['goodid'];
            $goodname = $_POST['goodname'];
            //添加購物車操作
            //$this->addcart($userid,$goodid,$goodname);
            //單獨刪除購物車商品
            //$this->removecart($userid,$goodid,$goodname);
        }else{
            echo $validate->getError();
        }
        */

       //2.獲取購物車的所有商品
       $rule0 = [
            'userid'=> "require|number",
        ];
        $validate = new Validate($rule0);
        if ($validate->check($data)){
            $userid = $_POST['userid'];
            //獲取購物車商品操作
        //  $data = $this->getCartList($userid);            var_dump($data);
          $this->delcart($userid);
        }else{
            echo $validate->getError();
        }


    }

    /**
     * 添加購物車
     * @param $userid 用戶id
     * @param $goodid 商品id
     * @param $goodname 商品名稱
     * (購物車沒有添加時間)
     */
    public function addcart($userid,$goodid,$goodname)
    {
        $hashKey = 'cart_'.$userid;  //hash名稱
        $key = $goodid."_".$goodname; //hsah鍵名
        $this->redis->hincrby($hashKey,$key,1); //設置hash鍵名+1
    }

    /**
     * 用戶清空購物車
     * @param $userid 用戶id
     */
    public function delcart($userid)
    {
        $hashKey = 'cart_'.$userid;
        $this->redis->del($hashKey);
    }

    /**
     *用戶移除購物車中某件商品(可以根據商品id獲取商品名稱,這裏爲了方便)
     * @param $userid
     * @param $goodid
     */
    public function removecart($userid,$goodid,$goodname)
    {
        $hashKey = 'cart_'.$userid;  //hash名稱
        $key = $goodid."_".$goodname; //hsah鍵名
        $this->redis->hdel($hashKey,$key);
    }

    /**
     *
     */

    public function getCartList($userid)
    {
        $hashKey = 'cart_'.$userid;  //hash名稱
        $data = $this->redis->hGetAll($hashKey);
        return $data;
    }


}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章