购物车增删改与清空,用Redis实现一下吧(购物车放redis还是数据库)

网友投稿 388 2022-07-22

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

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实现的购物车单例类

,可借鉴:

 * 购物车单例类

 *

 * @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();

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微服务架构优势在哪,与传统服务又有什么区别呢?(传统架构的问题和微服务的优点)
下一篇:作为程序员,你是如何有效的调试bug的(程序员如何减少bug)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~