您好,登录后才能下订单哦!
这篇文章给大家介绍使用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里面取出来。
关于使用redis怎么实现一个购物车基本功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。