通常狀況下購物車功能都是使用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