redis實現購物車流程

  使用Redis實現購物車功能

  通常狀況下購物車功能都是使用SESSION/COOKIE實現的,也就是將整個購物車數據都存儲到SESSION中。這樣作的好處就是不用操做數據庫就能夠實現,同時用戶能夠不一樣登陸就能夠將商品加入到購物車中,缺點就是1. 致使SESSION過於臃腫 2. SESSION數據默認是存儲到文件中的,因此操做SESSION是相對比較慢的。 而將購物車數據存放到Redis中,能夠加快購物車的讀寫性能,從而提升用戶體驗,缺點就是Redis數據是存放到內存,相對成本較高。可是這個成本,通常企業均可以接受。php

核心代碼以下:redis

Cart.class.php代碼數據庫

<?php

//使用redis實現一個購物車功能
class Cart
{

    /**
     *  購物車有功能: 一、 將商品添加到購物車中  二、改變購物車商品數量  三、顯示購物車的信息
     *
     *
     * 將商品添加到購物車中功能分析以下:
     * 1. 接收到商品ID
     * 2. 根據商品ID查詢商品信息
     * 3. 將商品信息加入到購物車中
     *
     *         a. 判斷購物車是否已有對應商品
     *         b. 若是購物車中沒有對應的商品,直接加入
     *         c. 若是購物車中有對應的商品,只要修改商品數量
     */

    public function __construct()
    {
        //若是成員屬性沒有聲明,默認就是公有屬性
        $this->redis = new Redis;
        $this->redis->connect('127.0.0.1', 6379);
    }

    public function addToCart($gid, $cartNum=1)
    {

        session_start();
        if ($gid <= 0) {

            throw new Exception("請輸入商品ID");

        }

        //根據商品ID查詢商品數據
        $goodData = $this->goodsData($gid);

        $key = 'cart:'.session_id().':'.$gid;//id 說明:一、不單單要區分商品  二、 用戶

        // $data = $this->redis->hget($key, 'id');
        $data = $this->redis->exists($key);


        //判斷購物車中是否有無商品,而後根據狀況加入購物車
        if (!$data) {

            //購物車以前沒有對應的商品的

            //購物車的商品數量
            $goodData['num'] = $cartNum;

            //將商品數據存放到redis中hash
            $this->redis->hmset($key, $goodData);


            $key1 = 'cart:ids:set:'.session_id();

            //將商品ID存放集合中,是爲了更好將用戶的購物車的商品給遍歷出來
            $this->redis->sadd($key1, $gid);

        } else {

            //購物車有對應的商品,只須要添加對應商品的數量
            $originNum = $this->redis->hget($key, 'num');

            //原來的數量加上用戶新加入的數量
            $newNum = $originNum + $cartNum;

            $this->redis->hset($key, 'num', $newNum);


        }

    }

    //顯示用戶購物車的全部商品
    public function showCartList()
    {

        session_start();

        $sessId = session_id();


        $key = 'cart:ids:set:'.session_id();

        //先根據集合拿到商品ID
        $idArr =  $this->redis->sMembers($key);


        for ($i=0; $i<count($idArr); $i++) {

            $k  = 'cart:'.session_id().':'.$idArr[$i];//id 

            // echo $k,'<br/>';
            $list[] = $this->redis->hGetAll($k);
        }

        include './View/show.php';

    }

    public function goodsData($gid)
    {

        $goodsData = array(

            1 => array(
                'id' => 1,
                'gname' => 'xxoo',
                'price' => '1.5'
            ),

            2 => array(
                'id' => 2,
                'gname' => 'xxoo22',
                'price' => '221.5'
            ),
            3 => array(
                'id' => 3,
                'gname' => 'xxoo33',
                'price' => '331.5'
            ),
            4 => array(
                'id' => 4,
                'gname' => 'xxoo44',
                'price' => '4441.5'
            ),    
        );

        return $goodsData[$gid];
    }
}

這文章轉載了此博文:https://www.3maio.com/w-detail/7;session

相關文章
相關標籤/搜索