1.准备工作:

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

测试工具:POSTMAN

redis客户端:Redis Desktop Manager

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

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_redis

 

逻辑处理 :

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_redis_02

购物车基本功能:

1.购物车列表

2.加入购物车

3.删除购物车某个商品

4.清空购物车

 

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

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_redis cart_03

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

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_客户端_04

 

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_redis cart_05

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_字符串_06

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

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_redis_07

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_redis_08

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_redis cart_09

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_客户端_10

 

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购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_redis_11

 

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

redis购物车设计,如果商品价格变了,购物车咋办 redis实现购物车功能_redis cart_12

  

 

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

 

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

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