千家信息网

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

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章给大家介绍使用redis怎么实现一个购物车基本功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.准备工作:数据库表设计 (yj_product_specificati
千家信息网最后更新 2024年11月22日使用redis怎么实现一个购物车基本功能

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

0