基于redis实现购物车基本功能

1.准备工作:

数据库表设计 (yj_product_specification:商品规格表,用户表,商品表等     {没有规格表,只有规格值表,}),

测试工具:POSTMAN

redis客户端:Redis Desktop Manager

其他的工具 我就不一 一说了 。

 

逻辑处理 :

购物车基本功能:

1.购物车列表

2.加入购物车

3.删除购物车某个商品

4.清空购物车

 

首先来分析一下加入购物车,这也是购物车中最难的功能(个人认为)

加入购物车时  我们要考虑到  对于一个客户来说  不同规格,不同商品 ,在内存中应该怎么处理 ,  必要的几个参数   首先用户信息要得到(mem_Id),商品的信息(prd_id),商品所对应规格值的id,这个信息我们都要取到,我们还要考虑对于不同用户,不同的信息,在redis要怎么存储。redis的类型我就不在这里说了。我在redis做的划分是  以用户的id作为redis的key  当然对于不同商品来说  我们还要注意一个商品的不同规格,数量都是要区分的(我们是用hash来存储的),而且还是保证hash的key唯一。如果说我们把hash的key由商品id,规格值 等共同组成的话   那么这样的话  我们这样就可以很容易就区分的清楚。对于前端传过来的参数都是固定,所以我们直接用一个实体来接收

 

用debug看一下  这个cart里面是什么东西   注意看一下这个那个多信息拼装的     

 

private void addCart(Member member, Cart cart) throws Exception {
// 监听当前登陆用户
Jedis jedis = jedisUtil.KEYS.watch("cart_" + member.getId());// 监听key
Transaction multi = jedis.multi(); // 用返回的jedis对象开启事务
        String cartFiled = cart.getProductId() + "_" + cart.getSpecificationValueIds();
        // 购物车对象字符串,查询到当前redis上这个规格的购物车信息
String cartStr = jedisUtil.HASH.hget("cart_" + member.getId(),cartFiled);
//将String类型转为Cart对象
Cart _cart = Cart.parseObject(cartStr);
// 购物车存在,商品数量做累加
if (_cart != null) {
Integer num = cart.getNumber();
_cart.setNumber(_cart.getNumber() + num);
_cart.setPrice(cart.getPrice());
_cart.setFullName(cart.getFullName());
_cart.setImage(cart.getImage());
} else{
_cart = cart;
}


// 一个用户一个购物车,一个商品规格对应一个购物车项,将购物车存到redis
multi.hset("cart_" + member.getId(), cartFiled, _cart.toJSONString());


// 获取事务执行结果,如果监听的mahjongXA的值发生改变事务会执行失败,返回null
List<Object> exec = multi.exec();
// 释放监听
jedisUtil.KEYS.unwatch(jedis);
// 当事务执行失败是重新执行一次代码
if (exec == null) {
addCart(member, cart);
}

}

在用户加入购物车的时候,我们需要先看一下   当前商品和规格   在redis里面是否已经存在  如果存在  就直接在数量上面加减  不存在的就直接加入就可以了 

// 购物车存在,商品数量做累加
if (_cart != null) {
Integer num = cart.getNumber();
_cart.setNumber(_cart.getNumber() + num);
_cart.setPrice(cart.getPrice());
_cart.setFullName(cart.getFullName());
_cart.setImage(cart.getImage());
} else{
_cart = cart;

}

 

对于在用户在客户端操作方面来说  如果用户在前端连续点击   有可能造成并发,所以在加入购物车的时候我注意并发事件,redis为我提供了watch   我可以通过watch来监听  ,避免连续点击

 

当取redis缓存的时候,值发生改变的,watch下面的事物事件会中断,这样的话 

  

 

exec对象就为null   就会去redis里面再去取一次。

 

对于购物车的删除和清空  就比较简单了  我们只要了解redis的存储 就可以轻松解决这两个功能。

当然 对于用户来说   分为登陆用户和未登陆用户。以上为登录用户,未登录用户的  需要先存cookie里面   当登陆的时候从cookie里面取出来。 
 

转载于:https://my.oschina.net/Skynet01/blog/3074182

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值