目前我们使用购物车的存储方式主要有:Session方式,Cookie方式,数据库存储,我们来一一分析优缺点。

1.Session(Memcached)方式

  • 优点:购物车信息保存在服务端,可以保存1M 信息。
  • 缺点:对于大型网站会占有过多的服务器内存资源,造成服务器压力过大。Session保存的信息会在用户退出登录后丢失。用户下次登录,购物车中商品信息丢失,用户只能从新选择。

2.Cookie方式

  • 优点:购物车信息存储在客户端,不占用服务器资源,基本可以到达持久化存储。
  • 缺点:Cookie有大小的限制,不能超过4K,而且不够安全。如果是个人PC机,Cookie能很好的保存购物车信息,但如果是公共办公环境,Cookie保存的信息基本就失效了(会被其他人购物车信息覆盖)。对一个大型的电子商务网站,我们需要对用户的购买行为进行分析,需要对用户推荐用户感兴趣的商品,如果把购物车信息保存在Cookie中,则不能对用户购买行为分析统计。

3.数据库存储

  • 优点:持久化存储,可以分析用户购买行为。
  • 缺点: 网站速度变慢,成本和维护增加。

对于一个大型的电子商务网站,我们需要知道用户对什么样的商品感兴趣,需要给用户推荐相似度商品。那么就有必要分析用户的购买行为。在这里只详细讲述下使用数据库存储方式的演变。开始我们是使用Cookie存储购物车的信息,但使用一段时间后发现有很多客户投诉,购物车中常常会多了很多商品,而且并不是客户选择的商品。数据挖掘部门也抱怨不能分析购物车的信息。。。。我们决定改变购物车的存储方式。开始我们设计的表是这样的:

       对于登录用户,我们根据UserId查询购物车信息。对于非登录用户,则根据浏览器选择查询方式,如果是火狐浏览器,我们根据SessionId查询,如果是IE或360浏览器,我们根据IP查询。在一天订单量只有几万单的时候,系统运行的很稳定。**但发现一天订单量超过10万单的时候,特别是高峰期,购物车数据库写压力特别大。查询也时常超时。我们不得不清理存储时间超过10天的数据。我们新建一个Job每天夜里执行删除超过10天的数据。但随着订单量的增加。数据库写压力依然很大。这时候我们考虑分库来解决数据库的写压力。我们根据登录用户和匿名用户来拆库。**采用如图方式

       对于登录用户我们根据UserId拆成2个库,一个是奇数库,一个是偶数库。对于匿名用户我们根据浏览器拆分,火狐浏览器(SessionId查询)一个库,IE或360浏览器(根据IP查询)一个库。

对于表结构,我们也做了调整。使用UserId和CreatedDateTicks时间撮做联合主键,登录用户购物车表结构:

       匿名用户(火狐浏览器)存储表结构:

       IE或360浏览器存储表结构:

       数据存储方面我们也做了调整。删掉了大量的数据库更新操作,因为大量的更新操作会造成锁表。购物车信息发生变化时,Content保存用户购物车信息的XML。现在只需做插入操作了。查询数据时,返回最后一条数据即可。**采用分库后减轻了单台数据库写数据的压力,Content保存购物车信息的XML避免大量的更新操作。**现在系统可以平稳的运行了!

一般来说,可以使用session,cookie和数据库来记录购物车数据

1,不过不提倡使用session,这货占用服务器资源,还有过期时间,客户关掉浏览器时session即消失,下次再上来,又得重新选产品。

2,cookie这东西不错,放在客户端的,给个一年的过期时间,只要客户不清掉,每次来都能记得上次的购物车信息。大家可以看看京东,在购物车cookie中存了不少东西,有产品编码和购买的数量等信息,如京东:yCartOrderLogic={&TheSkus&:[{&Id&:437741$&Num&:2}]}。所以,我以学习的心态,将产品编码,价格,名称,类型和数量等购物信息做成一个对象,然后对象序列化成JSON,存在客户端的COOKIE中,在读取cookie时,在刚开始的时候很好用,反序列化cookie值成购物车条目对象就可以了,但是当产品类型多起来之后,而且有套装那种多件产品时,甚至产品不是来自同一个数据表时,比如普通首饰和钻石,表的结构都不一样了,还得到不同的表格中去取,当然首先你得判断产品类型,这时候一个购物条目对象已经有多条子对象,往往一个查询中嵌套着两重以上的循环加上多个switch case,当购物车中有十个复杂的条目时,读取速度将超过十秒, 不管怎么优化,速度就摆在那里,不快不慢。。。而且你不能保证客户不下100个或更多的复杂购物车记录,最重要的是cookie是有
存储大小限制的,这种做法有产品很复杂时是不利的,果断放弃!

3,数据库这东西好啊,不会像cookie那种容易丢失,也没有客户端的限制, 你想怎么存,存多少都行。购物车数据存数据库好处有很多,可以分析购买行为,可以为客户保存购买信息(不会因为浏览器关闭而丢失)等。还需要考虑的一个问题是用户是否登录,淘宝使用的就是cookie记录,你可以试试,未登录时可以加20个商品,登录后可以加50个,这就是因为cookie客户端的限制

我这里因为产品线的复杂性,所有购物车条目都保存在数据库中。购物车数据库设计成两个关联表

1,Basket,购物车主表

基本字段有:BasketId,AddTime,UserId,AddressId,Payment,Status等,不解释了,看英文意思就行

2,BasketDetail,购物车条目表

基本字段有:BasketDetailId,BasketId,Type,Code,Qty,ParentId等,ParentId用作子行标识,其它不解释

两个表之间使用BasketId做为关联

当用户登录状态时,添加产品到购物时,查看Basket中是否有Status为True的购物车,没有则添加一条新的Basket记录,并将产品信息相关数据添加至BasketDetail表中。

当用户未登录时,使用cookie记录一个BasketId值,不往Basket表中插入数据,只往BasketDetail插入数据,其中的BasketId值使用cookie中的BasketId值,当用户登录后,查看Basket中是否有Status为True的购物车记录,有则合并(更新cookie和BasketDetail中的BasketId为查询出来的Basket表中的BasketId值),无则添加一条新的Basket记录,并将BasketId值置为Cookie中记录的basketid值

购物车存储在什么位置比较合适?Session?Cookie?数据库?相关推荐

  1. 美多商城之购物车(购物车存储方案)

    一.购物车存储方案 用户登录与未登录状态下,都可以保存购物车数据. 用户对购物车数据的操作包括:增.删.改.查.全选等等 每个用户的购物车数据都要做唯一性的标识. 1.1. 登录用户购物车存储方案 1 ...

  2. 阿语python美多商城-商品-购物车之第7.1节购物车存储方案

    购物车存储方案 用户登录与未登录状态下,都可以保存购物车数据. 用户对购物车数据的操作包括:增.删.改.查.全选等等 每个用户的购物车数据都要做唯一性的标识. 1. 登录用户购物车存储方案 1.存储数 ...

  3. 计算机固态地址是什么,SSD固态硬盘安装到笔记本电脑什么位置比较合适

    SSD固态硬盘安装到笔记本电脑什么位置比较合适 SSD固态硬盘相对现在常用的机械硬盘来说,它的优胜之处在于磁盘读取速度不同,据说SSD固态硬盘的读取速度是传统机械硬盘的十倍,理论上使用SSD固态硬盘进 ...

  4. 服务器存储视频文件夹在哪里找,微信视频文件夹存储在什么位置?在哪里能找到...

    平时我们在使用微信时,会接收到好友或者群友发来的微信小视频,这些视频除了可以转发给好友外,还可以保存在手机中,不过很多小伙伴在保存下来视频后,不知道微信视频文件夹的存储位置,那么我们在哪里能找到微信视 ...

  5. Unity存储路径具体位置整理(Win+Android+ios)

    Unity存储路径具体位置整理 一:Application.dataPath: 这个路径在Unity打包工程目录下.通过这个路径可以访问项目中任何文件夹中的资源, 只能在PC端使用. 二:persis ...

  6. [Android多媒体二]调用系统录音机录音并存储到指定位置,适配安卓 7.0

    接上一篇文章,[Android多媒体一]调用系统相机拍照并存储到指定位置,适配安卓 7.0 本文讲述如何调用系统录音机,完成录音后,对录音进行指定位置的保存. 一.开始编写 首先,还是理清一下思路,在 ...

  7. session,cookie,sessionStorage,localStorage的区别及应用场景

    浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...

  8. 浅谈session,cookie,sessionStorage,localStorage的区别及应用场景

    浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互. 一.cookie和session cookie和session都是用来跟踪浏览器 ...

  9. Session/Cookie/Token还傻傻分不清?

    Cookie.Session.Token 傻傻分不清 Session/Cookie/Token 还傻傻分不清? 相信项目中用JWT Token的应该不在少数,但是发现网上很多文章对 token 的介绍 ...

最新文章

  1. scheduled 一秒钟执行一次_spring boot的Scheduled帮你实现定时任务,spring boot实践(11)...
  2. java汽车租赁系统_汽车租赁公司全网低价
  3. 第五届大数据科学与工程国际会议(2021)成功召开
  4. Vue学习笔记一 创建vue项目
  5. 第一讲:网络协议概述
  6. 使用JAVA的keytool生成jks证书,通过jks证书生成pfx证书,tomcat配置https
  7. 让IIS只监听一个IP上的80端口
  8. XueTr(PC Hunter) pro 注册分析
  9. 计算机硬件维修书,计算机硬件维修手册
  10. 教你如何养微信小号,什么样的号可以群爆粉?
  11. Android应用开发——记事本
  12. 刚刚!核电老将俞培根晋升东方电气集团董事长
  13. 百度坐标转WGS84(即GPS)坐标
  14. 数商云B2B跨境电子商务平台综合服务解决方案
  15. 河北大学计算机类信息安全专业就业前景,2018信息安全专业就业前景和就业方向分析...
  16. CPU也能速刷AlphaFold2?英特尔:请收下这份23倍通量优化指南
  17. Pycharm中光标变粗 光标进入改写状态
  18. Graphite的安装与部署
  19. 深度学习服务器配置过程
  20. laravel db类

热门文章

  1. 干货 | 携程机票前端安卓虚拟机测试集群建设实践
  2. 移动OA系统,开启办公自由便捷高效之门
  3. 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式
  4. 如何评价OA系统的易用性
  5. 解数独 — Python
  6. 分析各家2440开发板的性价比(转自Gooogleman)
  7. 大数据商机无限 掘金四行业个股
  8. ffmpge海康视频文件格式转换
  9. 为什么Harris角点检测用特征值? 为什么Harris像素值变化量矩阵代表椭圆?【OpenCV】【计算机视觉】
  10. Poetize4 玉蟾宫