1. 网站并发数:

  1. 经过压力测试,我们可以支持3000左右的并发,可以满足目前的业务需求。 (压力测试?)
  2. 由于我们的是分布式架构,支持水平扩展。如果将来并发量提高的话,可以增加服务器来提高并发量。 (分布式架构)

2. 人员配置

  1. 产品经理:3人。 确定需求以及给出产品原型图;
  2. 项目经理: 1人。 项目管理
  3. 前端团队: 5人。 根据产品经理给出的原型制作静态页面
  4. 后端团队:20 人。 实现产品功能。
  5. 测试团队:5人。 测试所有的功能。
  6. 运维团队:3人。 项目的发布以及维护。

3. 开发周期:

  1. 采用迭代开发的方式进行。周期未1个月左右。

4. SKU

  1. 最小库存量单位。 sku==商品id

5. redis缓存,你redis存的是什么格式的数据,是怎么存的?

  1. redis中存储的是key-value格式的。拿商品数据来说,key就是商品的id,value是商品相关信息的json数据。

6. 你前台portal采用4太服务器集群部署,那么前台高并发访问性能提上去了,数据库会不会造成一个瓶颈,这一块儿你是怎么处理的?

a. protal系统在高并发的情况下,如果每次请求都要查询数据库,确实会出现数据库的瓶颈。
b. 为了降低数据库压力,在服务层会添加一个缓存,用redis实现,这样的话请求先到缓存中查找是否有缓存的内容。
c. 如果有,直接从缓存中取数据;如果没有,再到数据库中查询。
d. 这样,数据库的压力就不会那么大了。

7. 什么是分布式?集群?优缺点?

  • 按照功能点,把系统拆分成独立的功能。
  • 单独未某一个节点添加服务器。
  • 系统之间相互配合以完成整个业务逻辑。这就叫分布式。

  • 集群:同一个工程部署到多台服务器上。

  • 优点:

    • 把模块儿拆分,使用借口通信,降低模块儿之间的耦合度;
    • 把项目拆分成若干个子项目,不同的团队负责不同的子项目;
    • 增加功能时,只需要再增加一个子项目。调用其他系统的接口就可以了。
    • 可以灵活的进行分布式部署。
  • 缺点:
    • 系统之间交互需要使用远程通信,接口开发增加工作量;
    • 各个模块有一些通用的业务逻辑无法共用。

8. 导入依赖的原则

  • 所有工程都需要的依赖应该在聚合工程(taotao-manage)中导入。
  • 在使用依赖的最底层导入;
  • 运行时使用的依赖在web工程中加入。

9. #{} 和 ${} 的区别

  • {} : 占位符,用于参数传递,可以防止SQL注入;

  • ${} : 用于SQL拼接

10. 什么是负载均衡高可用

  • nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重要的位置。
  • 如果nginx服务器宕机,后端web服务将无法提供服务,影响严重。
  • 为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。 主服务器和备份机上都可以运行高可用(High availability)监控程序。通过传送诸如“I am alive” 这样的信息来监控对方的运行状态。
  • 当备份机不能再一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;
  • 当备份服务器又从主服务器那里收到“I am alive”这样的信息时,它就释放IP地址,这样主服务器就开始再次提供负载均衡服务。

11. 什么是FastDFS?

  • FastDFS 是用C语言编写的一款开源的分布式文件系统。
  • FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、先行扩容等机制,并注重高可用、高性能等指标。
  • 使用FastDFS很容易搭建一套高性能的文件服务器集群来提供文件上传、下载等服务。

12. redis的优缺点

  • 支持多种数据类型存储;
  • 支持持久化;
  • 功能丰富;
  • 简单稳定,基于C语言开发。
    1. redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用,也可以将二者结合使用。
    2. 1.RDB持久化(默认支持,无需配置)该机制是指在指定时间间隔内将内存中的数据集快照写入磁盘
    3. 2.AOF持久化,该机制将以日志的形式记录服务器所处理的每一个写操作,在redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。

13. 什么是SolrCloud

  • SolrCloud是Solr提供的分布式搜索方案。

当你需要大规模、容错、分布式索引和检索能力时使用SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud的。
当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求。

  • solrCloud是基于Solr和Zookeeper的分布式搜索方案。它的主要思想是使用Zookeeper作为集群的配置信息中心。
  • 他有几个特色功能:
    • 集中式的配置信息;
    • 自动容错;
    • 近实时搜索
    • 查询时自动负载均衡

14. solr怎么设置搜索结果排名靠前(得分)?

  • 可以设置文档中 域的boost值。 boost值越高,计算出来的相关度得分就越高,排名也就越靠前。此方法可以把热点商品和推广商品的排名提高。

15. SpringMVC全局异常处理

  • 整个系统只有一个,使用方法
    • 需要实现一个接口: HandlerExceptionResolver
    • 需要在SpringMVC中配置
  • 处理逻辑:
    • 捕获整个系统中发生的异常
      • 异常写入日志文件
      • 及时通知开发人员。如邮件、短信。
    • 展示一个错误页面,如:您的网络故障,请重试。

16. 网页静态化

  • 好处:
    • 有利于搜索引擎化;
    • 提高访问速度
    • 解决高并发
  • 静态文件生成的时机:
    • 当后台添加、编辑商品时生成静态网页。
        1. mq发送信息
        1. 接收到消息,生成静态页面
      • 3.nginx访问静态页面

17. 什么是sso系统

  • 单点登录是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
  • 登录的处理流程:
      1. 登录页面提交用户名密码;
      1. 登录成功后生成token。Token相当于原来的jsessionID,字符串,可以用uuid.
      1. 把用户信息保存到redis. Key就是token, value就是TbUser对象转换成json
      1. 使用String类型保存Session信息。 可以使用 “前缀:token” 为key
      1. 设置key的过期时间。 模拟session的过期时间,一般为半个小时。
      1. 把token写入cookie中。
  • 如何判断是否登录?
    • 从cookie中取token
    • 取不到则是未登录
    • 取到token, 到redis中查询token是否过期
    • 如果过期,为重新登录状态;
    • 如果没有过期,则是登录状态。

18. 实现购物车商品数据同步

    1. 要求用户登录
    1. 把购物车商品列表保存到数据库中。推荐使用redis
    1. Key:用户id; value: 购物车商品列表。 推荐使用hash, hash的field: 商品id. value: 商品信息。
    1. 在用户未登录情况下写cookie。 当用户登录后,访问购物车列表时:
        1. 把cookie中的数据同步到redis;
        1. 把cookie中的数据删除;
        1. 展示购物车以redis为准;
        1. 如果redis中有数据,cookie中也有数据,需要做数据合并。 相同商品数量相加,不同商品添加一个新商品。
    1. 如果用户登录状态,展示购物车列表以redis为准。如果未登录,以cookie为准。

19. 浏览器跨域问题

  • 跨域是指从一个域名的网页去请求另一个域名的资源。浏览器出于安全的考虑,不允许不同源的请求。
  • JSONP解决AJAX跨域问题:
    • JSONP是服务器与客户端跨源通信的常用方法。最大的特点就是简单适用。 老式浏览器全部支持,服务器改造非常小。
    • 它的基本思想是:
      • 网页添加一个海量数据的存储问题
      • 解决办法是: NoSQL. 降低数据的安全性,减少对事物的支持,减少对复杂查询的支持,来获得性能的提升。
      • NoSQL的缺点: 有些使用场景绝对要有事物与安全指标的。所以还是得使用关系型数据库。
      • 为了解决海量存储问题,就需要数据库集群。为了提高查询性能,将一个数据库得数据分散到不同的数据库中存储。

20. 什么是数据分片

  • 简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库上面,以达到分散单台设备负载的效果。
  • 数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式:
      1. 按照不同的表来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直切分
      1. 根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库上面,这种切分称之为数据的水平切分。
  • 如何实现数据库分片?

    • 问题:当数据库分片后,数据由一个数据库分散到多个数据库中。此时系统要查询时需要切换不同的数据库进行查询,那么系统如何知道要查询的数据在哪个数据库中?当添加一条记录时要向哪个数据库中插入呢?这些问题处理起来都是非常的麻烦。
    • 解决:可以使用一个数据库中间件mycat来解决相关的问题:
      • MyCAT就是:一个新颖的数据库中间件产品,支持mysql集群,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。
      • Mycat读写分离:
        • 对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置

          21. 单点登录系统

    1. 作用:主要解决的是Session共享的问题。
      • 1、使用redis管理Session。
      • 2、key:token
      • 3、value:用户信息
      • 4、可以需要设置有效期。
      • 5、需要把token保存到cookie中。

购物车
1、未登录:使用cookie保存购物车数据
2、登录后:把购物车数据保存到redis。
2、购物车合并,应该以服务端的购物车为准。
电商活动倒计时方案:
1、确定一个基准时间。可以使用一个sql语句从数据库中取出一个当前时间。SELECT NOW();
2、活动开始的时间是固定的。
3、使用活动开始时间-基准时间可以计算出一个秒为单位的数值。
4、在redis中设置一个key(活动开始标识)。设置key的过期时间为第三步计算出来的时间。
5、展示页面的时候取出key的有效时间。Ttl命令。使用js倒计时。
6、一旦活动开始的key失效,说明活动开始。
7、需要在活动的逻辑中,先判断活动是否开始。
秒杀方案:
8、把商品的数量放到redis中。
9、秒杀时使用decr命令对商品数量减一。如果不是负数说明抢到。
10、一旦返回数值变为0说明商品已售完。
由于宜立方商城是基于SOA的架构,表现层和服务层是不同的工程。所以要实现商品列表查询需要两个系统之间进行通信。
如何实现远程通信?
1、Webservice:效率不高基于soap协议。项目中不推荐使用。
2、使用restful形式的服务:http+json。很多项目中应用。如果服务太多,服务之间调用关系混乱,需要治疗服务。
3、使用dubbo。使用rpc协议进行远程调用,直接使用socket通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。

22. 什么是dubbo

  • DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案
  • Dubbo就是资源调度和治理中心的管理工具。
  • dubbo服务开发流程,运行流程?zookeeper注册中心的作用?
    • 第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zookeeper。
    • 第二步:有了注册中心然后是发布服务,发布服务需要使用spring容器和dubbo标签来发布服务。并且发布服务时需要指定注册中心的位置。
    • 第三步:服务发布之后就是调用服务。一般调用服务也是使用spring容器和dubbo标签来引用服务,这样就可以在客户端的容器中生成一个服务的代理对象,在action或者Controller中直接调用service的方法即可。

Zookeeper注册中心的作用主要就是注册和发现服务的作用。类似于×××中介的作用,在系统中并不参与服务的调用及数据的传输。

23. 电商项目中是如何解决高并发和高可用的?

  • 页面静态化
  • fastDFS图片服务器
  • 数据缓存服务器
  • 数据库集群、库表散列(数据库的各种优化、数据库的拆分)
  • 负载均衡
    • 当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。 我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
    • 负载均衡是用反向代理的原理实现的。

24. redis为什么可以做缓存?项目中使用redis的目的是什么?redis什么时候使用?

  • 1)Redis是key-value形式的nosql数据库。可以快速的定位到所查找的key,并把其中的value取出来。并且redis的所有的数据都是放到内存中,存取的速度非常快,一般都是用来做缓存使用。
  • 2)项目中使用redis一般都是作为缓存来使用的,缓存的目的就是为了减轻数据库的压力提高存取的效率。
  • 3)在互联网项目中只要是涉及高并发或者是存在大量读数据的情况下都可以使用redis作为缓存。当然redis提供丰富的数据类型,除了缓存还可以根据实际的业务场景来决定redis的作用。例如使用redis保存用户的购物车信息、生成订单号、访问量计数器、任务队列、排行榜等。
  • 4)redis支持五种数据类型存储:1.字符串2.散列3.列表4.集合5.有序集合
  • redis集群中,某个节点宕机怎么办?你遇见过吗?你的解决思路是什么?

redis集群:一般的是至少是2台服务器,主从服务器!如果redis集群的主服务器挂了,没有关系还有备服务器

25. AcitveMQ的作用、原理、特点?(生产者。消费者。 p2p、订阅实现流程)

  • Activemq的作用就是系统之间进行通信。当然可以使用其他方式进行系统间通信,如果使用Activemq的话可以对系统之间的调用进行解耦,实现系统间的异步通信。原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,然后查看有多少个消费者,然后把消息转发给消费者,此过程中生产者无需参与。消费者接收到消息后做相应的处理和生产者没有任何关系。
  • 特点:1.对Spring的支持2.支持多种传送协议3.完全支持jms规范
  • ActiveMQ在项目中如何应用的?
    • Activemq在项目中主要是完成系统之间通信,并且将系统之间的调用进行解耦。例如在添加、修改商品信息后,需要将商品信息同步到索引库、同步缓存中的数据以及生成静态页面一系列操作。在此场景下就可以使用activemq。一旦后台对商品信息进行修改后,就向activemq发送一条消息,然后通过activemq将消息发送给消息的消费端,消费端接收到消息可以进行相应的业务处理。
  • ActiveMQ如果数据提交不成功怎么办?
    • Activemq有两种通信方式,点到点形式和发布订阅模式。如果是点到点模式的话,如果消息发送不成功此消息默认会保存到activemq服务端知道有消费者将其消费,所以此时消息是不会丢失的。

如果是发布订阅模式的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要 配置持久订阅。每个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时需要配置发送模式为持久化。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户 端正常接收后为止。

  • 当被问到某个模快存在安全性问题(sso单点登录系统)时,如何回答?
    • 目前淘淘商城的sso系统的解决方案中直接把token保存到cookie中,确实存在安全性问题。但是实现简单方便。如果想提高安全性可以使用cas框架实现单点登录。
    • https://www.apereo.org/projects/cas

26. 你做过电商项目,那么你说说sku的几种常用设计方法,你们的sku是怎么设计的?

  • sku:Stock Keeping Unit(库存量单位)产品统一编号的简称,每种产品均对应有唯一的SKU号
  • SKU属性的设计,可以分为两类:
    • (1)通过属性集关联SKU属性 适合品类较少的网站,管理容易些。
    • (2)产品和SKU属性直接关联
      • 适合品类很多网站,比较灵活,但是维护起来数据量比较大。
      • 为了简化,我增加SKU属性关联产品分类(可为空,表示是全局的),这样在创建产品时,可以只列出全局的+本产品分类的SKU属性,这样就不会一下子列出很多SKU属性了。SKU属性分为前端名称和后台名称两个,方便不同业务含义的SKU属性,在前端也能够用同一个名称显示,如颜色、容量等。另外在操作上可以做些优化,比如用下拉列表显示可选的SKU属性时,可以同时显示该属性的属性描述,供产品维护人员参考。
      • 基于SKU方式来管理产品时,产品的价格、库存和图片等信息必然是放在产品SKU表中处理的,和订单、购物车等表的关联,也是通过产品SKU表,而不是产品表。至于产品表,实际上是一个总的业务汇总和外部关联表,但实际销售的并不是它。我们网站做的更细些,会就每个产品SKU生成独立的URL(伪静态),但从SEO方面考虑,每个产品SKU拥有独立

27. 单点登录具体实现了什么功能?

    1. 去登陆页面
    1. 提交登陆页面
    1. 用户名、密码、验证码的校验
    1. 错误信息的回显
    1. 保存用户到Session中
    1. 重定向到登陆之前的访问页面
    1. Ajax跨域判断用户是否登陆

28. Redis在其中是怎么用的?起了什么作用?

  • redis中存储的都是key-value格式的。拿商品数据来说,key就是商品id,value是商品相关信息的json数据。
  • 在商城系统中当并发量比较高,频繁的对数据库进行读操作的时候都需要添加缓存。例如页面中内容数据的缓存、商品数据的缓存以及用户数据的缓存等。
  • 做商品数据的缓存时,因为商品的数据量很大,而且缓存是把数据保存到内存中,此时不可能把所有的商品数据都放到缓存中。所以需要设置商品数据缓存的有效期,当用户访问到非热点数据后,此数据放到缓存中,当缓存到期后就从缓存中删除,而且长时间不会添加到缓存。而热点数据一旦从缓存中删除会马上又添加到缓存。这样可以提高缓存的利用率,同时也减轻了数据库的压力。

29. 插入商品的话,要求级联插入几张表,你们当时是怎么实现的?通过Redis生成商品编号(ID)

  • 保存商品表
  • 再保存Sku表(此表中外键,是商品表的ID)

30. 采用的是nginx+tomcat来部署的(面试官会可能问nginx是谁来部署的?如何部署的?Nginx的执行流程,优点)

  • nginx一方面做加载静态资源的服务器,另一方面来做反向代理和负载均衡。因为该项目需要在多个环境中运行,我们利用了nginx的反向代理解决了不同环境同系统访问地址不统一带来的问题。
  • 因为整个项目实现的功能较多, 所以采用分布式的架构设计,整个项目包括后台管理系统、前台系统、订单系统、登录系统、搜索系统、购物车系统等,这样做的好处是使每个功能模块独立出来,降低了各系统之间的耦合度,增删一个功能不会影响其他功能模块。
  • 因为项目是采用分布式架构设计的,各模块之间是相互独立的,而各模块的访问路径又是不同的,所以当跨域请求数据的时候会遇到跨域受限的问题。比如当用户首次访问该网站首页时,首页页面会异步请求后台管理系统加载商品的类目,这是就会出现跨域受限的问题,以前开发时,如果在本模块内,我们是通过ajax异步请求数据的,但Ajax不支持跨域,所以用ajax无法解决跨域请求数据的问题。最后我们使用的是jsonp来解决这个问题的。jsonp通过script标签的src可以跨域请求的特性,加载资源,将加载的资源(通过一个方法名将数据进行包裹)当做是js脚本解析,定义一个回调函数(是怎么实现的?),获取传入的数据。我们使用jsonp是因为Jsonp的兼容性比较好,并且在请求完毕后可以通过callback的方式回传结果。但jsonp有一个缺点是只支持get请求而不支持post等其他类型的http请求。

这样我们解决了浏览器访问当前页面去加载后台系统数据出现的跨域问题,但是另一个问题又来了,其他系统该如何得到调用后台系统的数据呐?我们想可以发送http请求来访问后台数据,我 们想到的是使用httpclient来解决此问题,因为httpclient可以使用java代码模拟浏览器发送http请求(get方法如何传递参数?定义uribuilder对象,在uribuilder里设置参数,以key和value,都是 string类型的,然后将uribuilder放到uri中,在后将uri讲给httpget请求。Post方法如果传输数据?模拟表单提交,将数据封装到list集合中,然后将集合数据放入构造的表单实体中,在将表单实 体请求放到httppost对象中)。向外抛出一个接口,执行过程是:

  • 1、创建httpclient 对象
  • 2、构建请求对象post ,get请求
  • 3、如果有参数,就去构造请求参数
    • 3.1 get : 使用uribuilder去构造请求参数
    • 3.2 post: 构建表单实体,把表单实体放入到post请求对象中。
  • 4、执行请求 ,并且接受响应
  • 5、处理响应结果
  • 6、释放连接: 无论执行方法是否成功,都必须释放连接。
    • HttpClient实现认为是线程安全的。
  • 每次连接发起Http请求的时候都会重新建立连接(经历3次握手),用完就会关闭连接(4次挥手),这样会消耗很多时间,所有我们采用了连接池。如果不采用连接池,每次连接都会打开一个端口,在大并发的情况下系统的端口资源很快就会被用完,导致无法建立新的连接。

像项目中首页的大广告和商品类目这些不需要经常修改的数据,如果用户每次刷新页面的时候都要去数据库中查询,这样会浪费资源和增加数据库的压力。所以我们想当把这些数据添加到 一个缓冲中,用户去访问的时候,先去缓存中命中,如果命中失败,再去数据库中查询,然后把查询到的数据添加到缓存中。目前比较主流的缓存技术有Redis和Memcached,单纯从缓存 命 中的角度来说,Memcached要高一些,可Redis和Memcache的差距其实并不大,但Redis提供的功能更加强大一些,读写速度也很快。所以我们选用了redis来缓存数据。Redis把数据以 key—value的形式缓存到内存中,并提供了多种数据存储类型(string,set,list,hash等),还自身提供了持久化功能(2种),还可以把数据备份到磁盘中(Redis的SAVE命令用于创建当 前 Redis 数据库的备份),防止redis宕机时的数据丢失。(会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步)。我们 使用的是spring与jedis整合的客户端,可以利用jedis做分片式集群,解决了redis内存受限的问题。
之前实现的登录和注册是在同一个tomcat内部完成,而现在系统架构是每一个系统都是由一个团队进行维护,每个系统都是单独部署运行一个单独的tomcat,所以,不能将用户的登录信息 保存到session中(多个tomcat的session是不能共享的)(session共享?),所以我们需要一个单独的系统来维护用户的登录信息。我们是这样做的,用户去登录页面登录,去数据库查询 是 否有该用户,如果没有提示用户,如果有就把用户信息保存到redis中,并生成一个token保存到cookie中,
在后台管理系统中采用了Maven的多模块化的管理,其中采用了水平切分的方式(垂直与水平划分的区别:垂直:功能模块明确,层次不够清晰,代码重用性差。水平:层次清晰,代码重 用性高,独立维护。),将各层分层开发,这样做的好处是代码重用性高,层次清晰,易于独立维护。系统内部接口调用采用Httpclient,接口提供端采用RESTful方式的接口定义(一种软 件 架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件),系统之间的通知机制采用MQ的方式,使用RabbitMQ的实现,使用了RabbitMQ的消息订阅模式的消息机制; 部署方面,采用了Nginx+tomcat的模式,其中nginx的作用一方面是做反向代理、负载均衡、另一方面是做图片等静态资源的服务器;
在此项目中我主要负责后台管理模块,主要实现商品管理和商品规格参数管理,对商品和商品规格进行CRUD操作。;在实现前台调用后台数据时,为了实现系统间的调用,便使用了 httpclient技术来实现此功能,在后台提供了需要调用的接口。(httpclient介绍,工作原理,优缺点)。如果在后台对商品进行操作,为了使前台数据与后台数据实现同步,我们使用了 RabbitMQ 消息队列机制实现商品同步功能(RabbitMQ介绍,工作原理,优缺点);
在此项目中,我还参与了购物车模块的开发。在开发这个模块时候,我们考虑了会员在未登录和登录两种情况下把商品加入购物车,后台如何该保存商品信息。
在用户商品详情页点击加入购物车的时候,我们用了登录拦截器来判断用户是否登录;
如果没有登录,将商品信息保存到cookie中,当用户登录后,再把商品持久到数据库中;但是考虑到cookie储存大小的问题,还有当cookie储存的数据越多就会影响响应速度,我们决定使 用redis来缓存用户在未登录状态下的商品信息(redis介绍,原理,优缺点),在redis中设置缓存生存时间(如何做到的?),如果用户在规定时间内没有登录,数据便会自动删除。如果用 户在规定时间内登录了,便会通过RabbitMQ消息队列机制将数据同步到数据库中;