购物车增删改与清空,用Redis实现一下吧

2019-08-23 07:36:15来源:编程学习网 阅读 ()

新老客户大回馈,云服务器低至5折


购物车管理包含功能:提交商品到购物车、显示购物车列表、删除购物车里商品、修改购物车、清空购物车等等


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+redis实现的购物车单例类,可借鉴:
<?php /**
 * 购物车单例类
 *
 * @author YING
 * @param void
 * @return void
 */ class CartSingleton {
  //定义一个静态的私有变量   static private $_instance=null;
  private $redis=null;
  //私有化的构造方法   private final function __construct()   {
    //实例化     $this->redis=new Redis();
    $this->redis->connect('127.0.0.1',6379);
  }
  //私有化的克隆方法   private function __clone()   {
  }
  //公有的静态方法   static public function getInstance()   {
    if(!(self::$_instance instanceof self)){
      self::$_instance = new CartSingleton();
    }
    return self::$_instance;
  }
  /**
   * 加入购物车
   *
   * @author YING
   * @param userId goodsName goodsId 用户id 商品名称 商品id
   * @return int
   */    public function addCart($userId,$goodsName,$goodsId)    {
     $hashKey="user_".$userId; //hash键名      $key=$goodsId."_".$goodsName;//键名      //加入      return $this->redis->hIncrBy($hashKey,$key,1);
   }
  /**
   * 单删
   *
   * @author YING
   * @param userId goodsId
   * @return    */   public function cartDelOne($userId,$goodsId)   {
    $hashKey="user_".$userId; //hash键名     $key=$goodsId;//键名     //删除     return $this->redis->hDel($hashKey,$key);
  }
  /**
   * 清空购物车
   *
   * @author YING
   * @param userId
   * @return void
   */   public function cartDelAll($userId)   {
    $hashKey="user_".$userId; //hash键名     //删除     return $this->redis->del($hashKey);
  }
  /**
   * 购物车列表
   *
   * @author YING
   * @param userId
   * @return void
   */   public function cartList($userId)   {
    $hashKey="user_".$userId; //hash键名     //查询数据     return $this->redis->hGetAll($hashKey);
  }
} //实例化类 $obj=CartSingleton::getInstance(); 


原文链接:http://www.phpxs.com/post/6490/
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Redis在Laravel项目中的应用实例详解

下一篇:微服务架构优势在哪,与传统服务又有什么区别呢?