面试-JAVA电商项目面试题

以下是JAVA电商项目面试题汇总

什么是数据库分片
简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库上面,以达到分散单台设备负载的效果。
数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。
1.一种是按照不同的表来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直切分
2.另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库上面,这种切分称之为数据的水平切分。
如何实现数据库分片
当数据库分片后,数据由一个数据库分散到多个数据库中。此时系统要查询时需要切换不同的数据库进行查询,那么系统如何知道要查询的数据在哪个数据库中?当添加一条记录时要向哪个数据库中插入呢?这些问题处理起来都是非常的麻烦。
这种情况下可以使用一个数据库中间件mycat来解决相关的问题。
什么是Mycat?
简单的说,MyCAT就是:一个新颖的数据库中间件产品,支持mysql集群,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。
Mycat读写分离
数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置
单点登录系统
主要解决的是Session共享的问题。
1、使用redis管理Session。
1)key:token
2)value:用户信息
3)可以需要设置有效期。
4)需要把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通信。传输效率高,并且可以统计出系统之间的调用关系、调用次数。
什么是dubbo
DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案
Dubbo就是资源调度和治理中心的管理工具。

dubbo服务开发流程,运行流程?zookeeper注册中心的作用?
使用流程:
第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zookeeper。
第二步:有了注册中心然后是发布服务,发布服务需要使用spring容器和dubbo标签来发布服务。并且发布服务时需要指定注册中心的位置。
第三步:服务发布之后就是调用服务。一般调用服务也是使用spring容器和dubbo标签来引用服务,这样就可以在客户端的容器中生成一个服务的代理对象,在action或者Controller中直接调用service的方法即可。
Zookeeper注册中心的作用主要就是注册和发现服务的作用。类似于房产中介的作用,在系统中并不参与服务的调用及数据的传输。
电商项目中是如何解决高并发和高可用的?
1.页面静态化
2.fastDFS图片服务器
3.数据缓存服务器
4.数据库集群、库表散列(数据库的各种优化、数据库的拆分)
5.负载均衡
什么是负载均衡
当一台服务器的单位时间内的访问量越大时,服务器压力就越大,大到超过自身承受能力时,服务器就会崩溃。为了避免服务器崩溃,让用户有更好的体验,我们通过负载均衡的方式来分担服务器压力。
我们可以建立很多很多服务器,组成一个服务器集群,当用户访问网站时,先访问一个中间服务器,在让这个中间服务器在服务器集群中选择一个压力较小的服务器,然后将该访问请求引入该服务器。如此以来,用户的每次访问,都会保证服务器集群中的每个服务器压力趋于平衡,分担了服务器压力,避免了服务器崩溃的情况。
负载均衡是用反向代理的原理实现的。
redis为什么可以做缓存?项目中使用redis的目的是什么?redis什么时候使用?
1)Redis是key-value形式的nosql数据库。可以快速的定位到所查找的key,并把其中的value取出来。并且redis的所有的数据都是放到内存中,存取的速度非常快,一般都是用来做缓存使用。
2)项目中使用redis一般都是作为缓存来使用的,缓存的目的就是为了减轻数据库的压力提高存取的效率。
3)在互联网项目中只要是涉及高并发或者是存在大量读数据的情况下都可以使用redis作为缓存。当然redis提供丰富的数据类型,除了缓存还可以根据实际的业务场景来决定redis的作用。例如使用redis保存用户的购物车信息、生成订单号、访问量计数器、任务队列、排行榜等。
redis支持五种数据类型存储:1.字符串2.散列3.列表4.集合5.有序集合
redis集群中,某个节点宕机怎么办?你遇见过吗?你的解决思路是什么?
redis集群:一般的是至少是2台服务器,主从服务器!如果redis集群的主服务器挂了,没有关系还有备服务器
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

你做过电商项目,那么你说说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拥有独立

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

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

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