功能完善–购物车
标签(空格分隔): 淘淘商城
—、
存储Cookie的问题
在淘淘商城中,在用户未登录的情况下,用户选中的商品加入购物车之后,商品的数据以及数量都是存储在cookie中的。但是对于不同的浏览器存储cookie的大小是有限制的。如下图所示:
这样的话当如果用户一直添加购物车的话,这种实现方式肯定是有问题的。既然不能存储的客户端,那就只能存储到服务端了,解决方案如下:
第一:存储到数据库中
- 由于对cookie的操作存在大量的读和写并发操作,如果放在db中性能有很大的瓶颈。
- cookie数据是临时数据,当用户清空缓存之后,数据库会存在大量的垃圾数据
第二:存储到文件系统中
- 操作不方便,其他问题和存储在数据库类似。不推荐
第三:存储到缓存系统中
- 目前来看,存储在缓存系统是最好的实现方式。但鉴于服务器的内存有限,存储大量的数据会造成内存瓶颈,可以采用集群的模式。
- 存储方式如下:使用Map存储,生成一个32位的uuid作为key。Map的key使用产品id。value值存储购物车数据,这样修改效率也得到提升,如果使用String数据结构存储,每次修改购物车信息需要做频繁的反序列化操作也会影响性能。
登录后合并缓存中和数据库数据的问题
什么时候合并?购物车系统还是单点系统上做,单点系统知道登录时机,但是不能合并购物车。所以在登录的时候,发送MQ通知到购物车系统中。将cookie数据发送到购物车系统中合并并持久化
购物车数据量大且访问并发大的问题
购物车在最初的设计过程中,仅仅是希望用户对想购买的商品进行收集的操作,但是后期用户将这个功能用成了商品的收藏。这样就对购物车系统的访问量加大,存储购物车的数据也变大,怎么优化这个问题—读和写都造成了很大的压力。分析如下:
登录状态:使用数据库存储购物车数据
- 数据库的读并发:可以采用MySQL的读写分离操作,一主多从
- 数据库的写并发:采用读写分离只能解决读并发的压力,不能解决写的并发,写的并发,可以通过缓存解决,这样会引发数据库和缓存之间的数据同步问题。所以这个方案不是最好的。可以采用:分表分库的方式。将数据进行分离。当然这样会引发读数据不一致的问题,可以通过中间件(MyCat)来解决。
另一方案:队列。例如:12306的延迟下单。滴滴打车排队等待等功能,等待提交,避免高峰对服务器压力的问题。未登录状态下:使用的是Redis存储购物车数据,由于缓存的特性就是支持高并发,所以只需要解决量的存储问题,可以使用Redis集群。并且对购物车数据设置过期时间,将没有用的数据定时清理
下单后删除购物车数据的问题
由于下单操作在订单系统中完成是在订单系统中完成中的,这就涉及到应用之间系统通讯的问题,需要在系统下单完成之后,发送MQ消息到购物车系统中,购物车系统监听到该消息后,删除订单中的数据.