温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用redis怎么实现一个购物车基本功能

发布时间:2021-06-21 18:15:09 来源:亿速云 阅读:512 作者:Leah 栏目:大数据

这篇文章给大家介绍使用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怎么实现一个购物车基本功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI