购物车模块要能过存储顾客所选的的商品,记录下所选商品,还要能随时更新,当用户决定购买时,用户可以选择决定购买的商品进入结算页面。
功能要求:
购物车数据存在redis中,使用的是redis的hash类型存储,hash类型比较满足这个购物车的业务需求.
Hash存储形式:
{key:[{field:value},{ field:value },{ field:value },………..]}
{userId:[{skuId:cartInfo},{skuId: cartInfo },{skuId: cartInfo},………]}
CartInfo对象:
Id,用户id,skuId,cartPrice(加入购物车时价格),数量、实时价格、sku名称、sku图片、选择状态。
未登录和已登录 怎么区分????
使用userId进行区分,如果用户没登录,前端页面会给生成一个临时用户id userTempeId,前端采用随机数生成,生成完 存在了用户浏览器cookie中,通过网关全局过滤器获取cookie中的临时用户id。
登录后的购物车数据: key是真实用户id
{2:[{21:“商品信息”},{22: cartInfo },{23: cartInfo},………]}
未登录购物车:key是临时用户id,是随机数。
{hsjfhskf123238:[{21:“商品信息”},{22: cartInfo },{23: cartInfo},………]}
已经实现的功能:
要区分用户是否登录,如果登录 就添加登录购物车,使用真实用户id。如果没登录,添加未登录购物车,使用临时用户id。
触发合并
合并的时候,判断用户有没有已登录的购物车,如果有,已登录购物车和未登录购物车中是否有相同的商品,如果有相同商品,数量相加。不同的商品,直接把未登录购物车的商品改成已登录购物车的。
在购物车列表展示的时候,商品信息前面有个方框,可以打钩,勾选了就是选中,去掉勾选,就是没选中。
选中的作用是 后期去结算的时候,只结算购物车中选中的商品。
面试官问你,你们项目的微服务怎么拆分的????
根据业务功能拆分,不同的功能模块 是不同的微服务。
根据skuid去操作redis中的hash的field删除。
5)获取到选中的购物车,这个功能是给结算页用的。因为结算页需要获取到购物车中所有选中的商品,进行下单。
购物车使用redis进行存储,数据丢失问题?
Redis是基于内存的,重启或者挂了,内存的数据容易丢失。
Redis给提供了 持久化机制,RDB和AOF。RDB是默认开启的,容易丢失一些数据。丢失的是 这次持久化和上次持久化直接的数据。AOF 默认不开启,需要手动开启,持久化策略,有每秒钟持久化一次的,还一种是没个写(修改)操作 都会进行一次持久化。
两种都可以一起用。
我们项目对于购物车的设计主要分为两个部分:未登录和已登录两种状态。在添加购物车时需要进行判断用户是否登录,如果未登录,则将购物车的信息放在redis中,采用hash结构存储,key为uuid(用户的临时id)随机生成,field为skuId,value是商品购物项信息,同时在数据库进行持久化操作,将reids的Key(临时用户id)存放到cookie中。用户已登录状态下,cookie中会存放token,根据token我们能获取到用户的id,所以采用userId作为hash结构的key,field为skuId,value是商品购物项信息,后面就添加购物车、合并购物车…………………。
未登录:不能了,没有临时用户id了。
已登录:都不能登录了。
未登录购物车一定要有,已登录购物车可以没有。
未登录购物车使用的是临时用户id,这个临时用户id,用户可能会重新生成。一旦重新生成了临时用户id,未登录购物车里就会有垃圾数据了。
未登录购物车,过期时间可以指定,7天 15天 30天 都可以。
99个, 200个。
统计redis hash结构中的 有多少skuid就行了。
购物车上限控制,要做上限控制,如果不做,可能会有人不断的添加购物车,直到把你redis服务器内存干满。
京东 是 200个。真快乐商城 是 99个
这个可以实现,前端就可以做一个校验,当添加数量超过200个,就给提示,+号按钮禁用。
未登录:不一样
已登录:是一样的。
问 登录B用户的账号 购物车合并的数据是哪个用户的?
考的是业务的分析梳理能力:
2个用户使用的是同一个电脑,没问题,要看使用的是不是同一个浏览器!
还要看 B用户在哪个浏览器登录的!!!!
不减库存
需要验,防止之前添加的商品 价格有变化或者库存无货。
简历
责任描述:
负责购物车功能模块开发,具体包括添加、合并、删除购物车等功能。
技术描述:
使用Redis。。。