目前我们使用购物车的存储方式主要有: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时间撮做联合主键,登录用户购物车表结构:

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

一般来说,可以使用session,cookie和数据库来记录购物车数据
1,不过不提倡使用session,这货占用服务器资源,还有过期时间,客户关掉浏览器时session即消失,下次再上来,又得重新选产品。
2,cookie这东西不错,放在客户端的,给个一年的过期时间,只要客户不清掉,每次来都能记得上次的购物车信息。大家可以看看京东,
在购物车cookie中存了不少东西,有产品编码和购买的数量等信息,如京东:yCartOrderLogic={&TheSkus&:[{&Id&:437741$&Num&:2}]},
原来凡客的cookie中也以JSON的形式存了很多信息。
所以,我以学习的心态,将产品编码,价格,名称,类型和数量等购物信息做成一个对象,然后对象序列化成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值

购物车的数据应该保存在哪?相关推荐

  1. python提取txt数据到excel_python 读取txt中每行数据,并且保存到excel中的实例

    使用xlwt读取txt文件内容,并且写入到excel中,代码如下,已经加了注释. 代码简单,具体代码如下: # coding=utf-8 ''' main function:主要实现把txt中的每行数 ...

  2. 抓取微博热搜榜数据并保存在Excel中

    PC端我们抓包常用到工具是Fiddler,那app端要怎么抓包? 1.首先将jsoup-1.8.1.jar(点击下载).poi-3.7.jar(目前上传不了,可以CSDN资源中去搜索下载)这两个包放到 ...

  3. 练习:selenium 爬取京东的电脑商品100页的数据并保存到csv文件中

    练习:selenium 爬取京东的电脑商品100页的数据并保存到csv文件中 from selenium.webdriver import Chrome, ChromeOptions import t ...

  4. java 格式化json_JAVA 格式化JSON数据并保存到json文件中的实例

    使用fastjson格式化json数据并保存到文件 /** * 将JSON数据格式化并保存到文件中 * @param jsonData 需要输出的json数 * @param filePath 输出的 ...

  5. python提取pdf表格数据并保存到excel中

    pdfplumber操作pdf文件 python开源库pdfplumber,可以较为方便地获取pdf的各种信息,包含pdf的基本信息(作者.创建时间.修改时间-)及表格.文本.图片等信息,基本可以满足 ...

  6. python逐行读取txt写入excel_python 读取txt中每行数据,并且保存到excel中的实例

    使用xlwt读取txt文件内容,并且写入到excel中,代码如下,已经加了注释. 代码简单,具体代码如下: # coding=utf-8 ''' main function:主要实现把txt中的每行数 ...

  7. MATLAB 数据自动保存到Excel操作

    MATLAB 数据自动保存到Excel操作 欢迎学习交流! 邮箱: z-@1-6.com 网站: https://zephyrhours.github.io/ 在实验中,有时候将每次实验计算的结果一一 ...

  8. 爬取链家网二手房数据并保存到mongodb中

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 爬取链家网二手房数据并保存到mongodb中 文章目录 前言 一.爬虫的介绍 二.协程的介绍 三.css选择器 四.基于asyncio ...

  9. php cache缓存 购物车,Yii2使用Redis缓存购物车等数据

    服务器配置Redis Redis下载安装配置 wget http://download.redis.io/releases/redis-stable.tar.gz tar -xvf redis-sta ...

最新文章

  1. 精美的电路图都是怎么画出来的?
  2. html6个圆圈放一排,html中两个选择框如何并排放置(一)
  3. sega+model+3+android,世嘉MODEL2经典老游戏移植登场 追加联网对战
  4. Hibernate4一对多关系映射
  5. 数字图像处理的就业前景
  6. linux下安装TensorFlow(centos)
  7. 计算机网络第七版总结报告,计算机网络(第七版)第一章总结(超详细!)
  8. 够酷!小米全新折叠屏方案曝光:这次轮到小米引领潮流了?
  9. python3.8如何安装jieba库_安装jieba、wordcloud等第三方库
  10. 不,你根本不需要ML/AI,有SQL就够了
  11. vue-cli设置proxy代理
  12. 元气骑士没有手柄怎么解锁机器人_元气骑士机器人怎么解锁?机器人获取方式和技能介绍...
  13. 【研发设计】多人开发模式下的Git工作流介绍
  14. vs code 代码格式化整理
  15. 自底向上和自顶向下的区别
  16. 开发工程师与研发工程师的区别
  17. 当RPM包安装遇上“依赖性”问题时的解决办法
  18. 服务器被攻击怎么办?如何防止服务器被攻击?
  19. cdma 复制短息到uim卡的实现
  20. Windows10系统蓝屏解决方案

热门文章

  1. WPF Bind 绑定
  2. TP5 急速上手 语法规则
  3. Swift UI开发初探
  4. BZOJ3057 圣主的考验
  5. Java byte类型转换成int类型时需要 0XFF的原因
  6. TWaver With JavaFX
  7. 开放式的Video Captioning,中科院自动化所提出基于“检索-复制-生成”的网络
  8. 爬出数据标注陷阱,半监督学习模型暗藏多少玄机?
  9. 指纹识别开源竞赛启动,5000张指纹图像匹配
  10. 研究做得好,贡献也要大!腾讯AI Lab正式开源业内最大规模多标签图像数据集...