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;
    }


}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值