电商面试题100问

项目周期?
答:项目周期为3-4个月。前端

项目团队有多少人,如何分配的?
答:项目团队通常由6-10我的组成,4-5我的是java后台的,1-2个是前端,2个产品。java

在项目中充当什么样的角色?
答:在项目中的职位是组员或者组长,主要负责开发功能模块,后期配合测试修改bug。
看工做时间与入职的时间,在一家公司入职时间少于1年而且从事开发少于2年不多有机会担任小组领导node

项目中遇到的最大的问题是什么?
答:这种问题不要说通常的错误,尽可能说业务上的问题。例如:单点登陆的时候如何解决多系统之间用户登陆信息同步以及用户信息共享;登陆须要发送短信验证码的时候如何保证消息到达率是100%;如何实现redis与数据库信息同步;开发环境程序正常,生产环境程序bug等。mysql

如何保证所负责与需求相符合?
答:在作模块以前,与产品经理肯定好需求,再与项目负责人肯定好技术选型应用,在开发过程当中遇到业务问题与产品经理和项目负责人及时沟通。nginx

你以为作商品模块(首页展现、轮播图、购物车、单点登陆、订单)时的难点在哪里?
答:商品模块:添加或者修改商品时,数据库、redis、静态页面如何同步信息。
购物车:添加的商品数量与库存数量的对比。商品价格变更同步。购物车的存储。
单点登陆:如何进行多系统之间的信息交互。(主要指验证登陆信息)子系统如何保证登陆信息的安全。
订单:商品数量与库存的同步,商品价格的准确性。提交订单的方式,如何验证订单。web

所负责模块里有哪些功能?(不要上来就说增删改查)
答:商品模块的功能:添加商品时,商品图片的上传以及存储,商品价格确保准确性,商品的上下架。也能够简单介绍下查询的各类条件或删除的各类条件。以及商品信息同步(数据库、redis、静态页面等),商品id的生成规则。面试

在项目开发过程当中遇到不会的功能是如何处理的?
答:技术问题:首先是谷歌,在网上查看各类资料以及博客。其次是与同事交流。最后再去找领导。
业务问题:业务问题首先找经理沟通,技术问题首先google百度ajax

项目中前台与后台是如何进行数据交互的?
答:ajax,http请求,socket。redis

如何实现数据库与redis同步?
答:用消息队列mq实现。具体操做是在添加或者修改数据的时候,用mq来同步到数据库与redis,加上事务,确保reids与数据库数据一致。spring

在项目开发过程当中还有哪些工做内容?
答:与项目经理去客户公司肯定用户需求,与同事配合完成单元测试,与测试人员配合完成测试并修改bug,bug提交

项目共有多少张表?所作模块用到多少张表?表与表之间的关系?
答:180-220(选一个具体数值)。
商品模块:商品表,库存表,品牌表,分类表,商品详情表,规格表,图片表,商品排序表,商品筛选表,图片资源类型表,图片资源表,商品日志表,晒单图片说明表。
购物车:商品表,品牌表,分类表,库存表,用户表,库房表,购物车表,购物项表,优惠券表,商品推荐表。
订单:订单表,用户表,用户地址表,商品表,品牌表,分类表,库存表,库房表,地区表,物流信息表。
登陆(后台):用户表,权限表,角色表,用户角色表,权限角色表,日志表。

插入商品的话,要求级联插入几张表,大家当时是怎么实现的?

答:商品表,商品详情表,库存表,图片表,日志表。

项目中用的注解开发仍是手动注入?分别如何实现?为何?

答:注解开发,在类、属性、方法上写注解。由于项目中须要配置的太多,用注解能够简化开发。
1.
错误日志的处理?项目中的日志文件存在哪里?保存多长时间?

答:看日志大小存放, 通常是15天或者30天。存放在一个单独的服务器目录。
1.
生产环境与开发环境在上线部署的时候应该如何配置?

答:生产环境:
一、上线以前备份以前的项目
二、修改上线项目的相关配置
三、关停服务
四、替换以前的项目
五、启动服务,观察日志,是否异常
1.
开发时数据库中数据从哪来?数据量有多大?

答:开发时数据库数据部分来自客户或者运营,部分本身添加,部分来自网络爬虫扒的数据。
1.
如何保证库存?

答:用mq+redis。
1.
若是日志存储量过大如何处理?

答:按期清除日志,日志通常存放在另外一台服务器上,15-30天清理一次。
1.
在项目开发过程当中如何进行测试?压力测试如何作?

答:对本身所负责模块进行单元测试,而后交给公司测试人员进行测试。通常压力测试都是测试人员作,Visual
Studio 自带的工具,还有Loader
Runner(LR),轻量级的工具备Apache项目中的ApacheBench。
1.
项目的并发量有多大?用了多少台服务器?

答:并发量500-1000,服务器数量通常是10-20台左右,具体数量看图

{width=”6.393055555555556in”
height=”3.770138888888889in”}
1.
在项目中,是如何分配开发任务的?

答:开会时,由项目经理与组长分配到我的须要负责开发的功能模块。
1.
项目中的技术选型的依据是什么?

答:1.什么技术更适合当前项目的业务需求,例如互联网项目查询条件比较多,数据库框架选用mybatis;传统项目查询条件比较单一,选用hibernate比较合适。
2.若是两个技术都适用于项目,就看架构师更熟悉哪一个技术,由于若是大部分开发人员都不会,企业会负担很高的学习成本。
1.
项目的安全问题是如何解决的?

答:单点登陆用token来校验。或者能够说有专门负责项目安全的人员。或者说花钱买服务。
环境安全:初期经过购买云服务
程序安全;token +签名
1.
用户分为几种?每种所对应的权限?权限具体是如何实现的?

答:通常后天项目中普通用户、普通管理员、超级管理员。用shiro框架具体实现。
普通用户:访问。普通管理员:管理后台信息。超级管理员:全部权限。
1.
电商项目是否上线?用户量有多少?

答:能够说上线(找一个地方性的小型电商网站)或者测试没有完成,项目尚未上线。能够说用户量有日活量:几千。
1.
商品的属性是如何进行存储的?

答:须要存储到商品表,商品详情表,库存表,日志表等。
1.
工做之余有没有在研究一些流行的技术?

答:有,再看一些技术博客。好比说跨域,如何解决高并发,不一样系统之间的通讯。
1.
在项目中如何实现页面跳转并把当前页面数据传递到跳转页面?

答:把要传递的数据放在request域中(转发)。
1.
所负责模块的查询都有那些条件?那些是静态条件、哪些是动态条件?

答:商品的价格区间,商品的品牌,商品的分类,型号,颜色,大小,男/女,商品名称。
静态条件:商品的价格区间,商品的品牌,商品的分类,型号,颜色,大小,男/女
动态条件:商品名称,商品类型
1.
所负责模块中删除数据的时候直接删除就能够么?若是不是须要作哪些操做?

答:若是单表的能够进行逻辑删除,不会进行物理删除。级联删除,删除该条数据不影响到其余表中的数据就能够直接删除,不然要进行级联删除,这里也是指的逻辑删除。
1.
支付是如何作的?

答:与支付宝、微信对接,下载它 们两个的SDK(jar包),须要配置公钥与私钥,进行对接,根据官方文档的API,调用相关支付的借口,接收回调信息(成功或失败)。进一步作本身的业务逻辑操做。
1.
表是如何设计的?

答:能够说是项目经理或者架构师设计的。本身所负责模块能够根据项目需求来设计有哪些字段,须要关联到哪些表。尽可能推行单表设计,不定义外键约束。
1.
面向服务经过什么样的方式实现?

答:soa架构,表现层与服务层分离,用dubbo和zookeeper搭配完成。
1.
如何提升代码质量?在项目中如何优化代码?

答:尽可能减小没必要要的操做,尽可能不要用到三层以上的for循环与递归。写代码的时候要给关键代码写上注释。相同功能的代码进行抽取,抽取原则不影响功能的正常运行。
1.
商品的审核如何作的?

答:添加或者修改,商品的价格以及库存等重要信息要进行二次填写,以保证准确率。
前台js校验,后台java代码校验。
1.
在项目中如何调试bug?

答:1.以dug方式运行项目,打断点调试。2.查看项目中的错误日志。3.测试人员使用专业测试工具进行测试。4.运行脚本对代码进行测试。
1.
查询商品的时候若是redis没有数据,能够抛异常么?若是不能够如何作?

答:不能够用throws抛异常,能够用trycatch捕获异常。由于在redis中查询不到数据,还要对数据库进行查询,若是throws抛异常则不能按正常业务运行。
1.
购物车如何实现的?未登陆能够用购物车么?购物车的存储?

答:购物车有三种。1.存放在Cookie。2.放在缓存里面。3.放到数据库里面。
未登陆的时候能够放在cookie中,可是有的电商网站针对未登陆用户不提供购物车功能。(例如天猫、淘宝添加商品到购物车的时候必须先登陆)
1.
购物车里面商品种类能够无限添加么?同一种商品的数量有限制么?

答:不能够,京东最多只能够添加八十种(足够使用了),避免占用太多存储空间;商品数量根据商品类型来控制,通常不超过200种。
1.
若是库存数量少于购物车用户添加的数量如何处理?

答:每次用户访问购物车的时候,都发送ajax请求查询一遍redis或者数据库,若是存库数量少于购物车中商品数量,发送消息进行提示,并作相应修改。
1.
生成订单具有的条件?如何保证这些条件?

答:商品数量不能超过限制数量和库存数量。限制数量在前台用js校验,后台查询数据库校验库存。
1.
首页展现的轮播图,在页面中是如何存放的?在数据库中是如何存放的?

答:页面中存放的是图片地址,在数据库中存放的也是图片的地址。图片存放在另外一台服务器上面。
1.
用户地址是如何保存实现的?(具体)

答:用户的地址是单独存放在一张数据库表中的,须要绑定用户的id,还须要设置默认路径。
1.
在电商项目中如何针对不一样的用户作推送?

答:对用户的浏览内容作一下记录,而后在页面的下方或者右方作商品的推送。还有一种就是针对用户购物车或者关注商品作促销信息推送。
1.
如何迁移数据库(mysql)?

答:这里介绍的是mysql数据库,若是被问到其余的能够说只知道mysql的。
1.数据库直接导出,拷贝文件到新服务器,在新服务器上导入。
2.使用【MySQL GUI Tools】中的 MySQLMigrationTool。
3.数据文件和库表结构文件直接拷贝到新服务器,挂载到一样配置的MySQL服务下。

我在个人电脑上用虚拟机测试后,选中了占用时间最少的第三种方案。下面是三种方案的对比:第一种方案的优势:会重建数据文件,减小数据文件的占用空间。\

第一种方案的缺点:时间占用长。(导入导出都须要很长的时间,而且导出后的文件还要通过网络传输,也要占用必定的时间。)

第二种方案的优势:设置完成后传输无人值守\

第二种方案的缺点:设置繁琐。传输中网络出现异常,不能及时的被发现,而且会一直停留在数据传输的状态不能被中止,如不仔细观察不会被发现异常。 传输相对其余fang时间长。 异常后很难从异常的位置继续传输。

第三种方案的优势:时间占用短,文件可断点传输。操做步骤少。(绝大部分时间都是在文件的网络传输)
第三种方案的缺点:可能引发未知问题,暂时未发现。
1.
服务器宕机如何处理?所有宕机如何处理?

答:配置主从服务器,运维人员搭建集群后,从服务器会给主服务器发送信息,若是主服务器没有响应,那就启用从服务器。通常不会所有宕机,若是所有挂掉,就重启。
1.
一件商品只有2件,如今被他人购买一件,这边如何修改当前用户的商品信息?

答:这个考察的是对库存的安全校验。商品上架多少 库存 讲库存缓存在redis 中 下单 就在redis 减小,异步 在库存数据库中也减小商品 查询只查询redis 中的 商品库存更新后 更新redis 库存;在用户点击添加到购物车按钮时,发送ajax查询redis。
dubbo服务开发流程,运行流程?zookeeper注册中心的做用?端口是多少?
答:dubbo主要是发布服务和调用服务。
使用流程:
第一步:要在系统中使用dubbo应该先搭建一个注册中心,通常推荐使用zookeeper。
第二步:有了注册中心而后是发布服务,发布服务须要使用spring容器和dubbo标签来发布服务。而且发布服务时须要指定注册中心的位置。
第三步:服务发布以后就是调用服务。通常调用服务也是使用spring容器和dubbo标签来引用服务,这样就能够在客户端的容器中生成一个服务的代理对象,在action或者Controller中直接调用service的方法便可。
Zookeeper注册中心的做用主要就是注册和发现服务的做用。相似于房产中介的做用,在系统中并不参与服务的调用及数据的传输。
1.
消息中间件acitveMQ的做用、原理?几种模式,每种的特色及使用问题?MQ发送消息失败怎么办?

答:Activemq的做用就是系统之间进行通讯。固然可使用其余方式进行系统间通讯,若是使用Activemq的话能够对系统之间的调用进行解耦,实现系统间的异步通讯。原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,而后查看有多少个消费者,而后把消息转发给消费者,此过程当中生产者无需参与。消费者接收到消息后作相应的处理和生产者没有任何关系。
Activemq有两种通讯方式,点到点形式和发布订阅模式。若是是点到点模式的话,若是消息发送不成功此消息默认会保存到activemq服务端知道有消费者将其消费,因此此时消息是不会丢失的。若是是发布订阅模式的通讯方式,默认状况下只通知一次,若是接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的状况。若是要求消息必须送达不能够丢失的话,须要配置持久订阅。每一个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时须要配置发送模式为持久化。此时若是客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。
1.
Tomcat集群中怎么实现共享

答:用dubbo与zookeeper配合来实现tomcat共享。
1,tomcat自身提供的session集群共享
2,编写tomcat的session插件对session进行存储
3,使用javaweb规范中的filter对request对象的getSessio()进行拦截替换实现集群共享

1.

Shiro如何进行权限控制?

答:1.经过浏览器访问路径,配置文件查看,是否须要认证等,若是不须要,直接访问controller
2.若是须要认证,经过配置文件的loginUrl,跳到这个地址,输入用户名、密码等
3.登陆:1.访问自定义的form表单过滤器FormAuthenticationFilter(本身起的名字和shiro同样了,因此。。)的createToken方法,装配token;若是没有自定义表单过滤器,默认的FormAuthenticationFilter会自动装配表单token2.访问自定义realms的认证方法doGetAuthenticationInfo(),查库(或者缓存),判断用户名和密码是否正确。
4.若是登陆以后访问的url,经过配置文件里的配置须要权限:调用自定义realms的受权方法:doGetAuthorizationInfo(),查库(或者缓存),查出用户权限,判断是否拥有权限,没权访问,跳到响应的refuse配置的路径,有权访问,跳到响应的url
1.
solr的原理?分词器的原理?如何设置高亮显示?

答:Solr是基于Lucene开发的全文检索服务器,而Lucene就是一套实现了全文检索的api,其本质就是一个全文检索的过程。全文检索就是把原始文档根据必定的规则拆分红若干个关键词,而后根据关键词建立索引,当查询时先查询索引找到对应的关键词,并根据关键词找到对应的文档,也就是查询结果,最终把查询结果展现给用户的过程。
IK分析器的分词原理本质上是词典分词。如今内存中初始化一个词典,而后在分词过程当中逐个读取字符,和字典中的字符相匹配,把文档中的全部的词语拆分出来的过程。
1.
秒杀功能可否与正常的商品购买放在同一台服务器上?

答:能够,可是尽可能不要这么作。由于秒杀商品,抢购的用户会比较多,并发量太高容易引发宕机,致使正常购买商品功能也不能正常使用,因此建议放在不一样服务器上。
1.
redis是内存数据库,若是宕机了,如何解决数据丢失的问题?

答:方案一:redis拥有两种不一样形式的持久化方法,它们均可以用小而紧凑的格式将存储在内存中的数据写入硬盘:第一种持久化方法为时间点转储,转储操做既能够在“指定时间段内有指定数量的写操做执行”这一条件被知足时执行,又能够经过条用两条转储到硬盘中命令中的任何一条来执行;第二种持久化方法将全部修改了数据库的命令都写入一个只追加文件里面,用户能够根据数据的重要程度,将只追加写入设置为从不一样步、每秒同步一次或者每写入一个命令就同步一次。
方案二:使用redis集群。Redis实现了主从复制的特性:执行复制的从服务器会链接上主服务器,接受主服务器发送的整个数据库的初始副本;以后主服务器执行的写命令,都会被发送给全部链接着的从服务器去执行,从而实时地更新从服务器的数据集。由于从服务器包含的数据会不断地进行更新,因此客户端能够向任意一个从服务器发送读请求,以此来避免对主服务器进行集中式的访问。
1.
商品存入数据库怎么保证数据库数据安全?

答:设置后台用户的权限,并对数据库修改作好记录(日志),保证责任到人。
1.
项目中商品小图片点开后,单品页面是大图片,这些图片是如何处理的?

答:在小图片上设置链接,点击小图片后,加载大图片。
什么是负载均衡高可用
nginx做为负载均衡器,全部请求都到了nginx,可见nginx处于很是重点的位置,若是nginx服务器宕机后端web服务将没法提供服务,影响严重。
为了屏蔽负载均衡服务器的宕机,须要创建一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,经过传送诸如“I am alive”这样的信息来监控对方的运行情况。当备份机不能在必定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。

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

(搜索)

solr怎么设置搜索结果排名靠前(得分)?
能够设置文档中域的boost值,boost值越高计算出来的相关度得分就越高,排名也就越靠前。此方法能够把热点商品或者是推广商品的排名提升。

elsticsearch

一、elasticsearch了解多少,说说大家公司es的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
解答:
如实结合本身的实践场景回答便可。
好比:ES集群架构13个节点,索引根据通道不一样共20+索引,根据日期,每日递增20+,索引:10分片,每日递增1亿+数据,
每一个通道天天索引大小控制:150GB以内。
仅索引层面调优手段:
1.一、设计阶段调优

1)根据业务增量需求,采起基于日期模板建立索引,经过roll over API滚动索引;
2)使用别名进行索引管理;
3)天天凌晨定时对索引作force_merge操做,以释放空间;
4)采起冷热分离机制,热数据存储到SSD,提升检索效率;冷数据按期进行shrink操做,以缩减存储;
5)采起curator进行索引的生命周期管理;
6)仅针对须要分词的字段,合理的设置分词器;
7)Mapping阶段充分结合各个字段的属性,是否须要检索、是否须要存储等。 …

1.二、写入调优

1)写入前副本数设置为0;
2)写入前关闭refresh_interval设置为-1,禁用刷新机制;
3)写入过程当中:采起bulk批量写入;
4)写入后恢复副本数和刷新间隔;
5)尽可能使用自动生成的id。

1.三、查询调优

1)禁用wildcard;
2)禁用批量terms(成百上千的场景);
3)充分利用倒排索引机制,能keyword类型尽可能keyword;
4)数据量大时候,能够先基于时间敲定索引再检索;
5)设置合理的路由机制。

二、elasticsearch的倒排索引是什么?
面试官:想了解你对基础概念的认知。
解答:通俗解释一下就能够。
传统的咱们的检索是经过文章,逐个遍历找到对应关键词的位置。
而倒排索引,是经过分词策略,造成了词和文章的映射关系表,这种词典+映射表即为倒排索引。
有了倒排索引,就能实现o(1)时间复杂度的效率检索文章了,极大的提升了检索效率。

学术的解答方式:

倒排索引,相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成——词典和倒排表。

加分项:倒排索引的底层实现是基于:FST(Finite State Transducer)数据结构。
lucene从4+版本后开始大量使用的数据结构是FST。FST有两个优势:

1)空间占用小。经过对词典中单词前缀和后缀的重复利用,压缩了存储空间;
2)查询速度快。O(len(str))的查询时间复杂度。

三、elasticsearch 索引数据多了怎么办,如何调优,部署?
面试官:想了解大数据量的运维能力。
解答:索引数据的规划,应在前期作好规划,正所谓“设计先行,编码在后”,这样才能有效的避免突如其来的数据激增致使集群处理能力不足引起的线上客户检索或者其余业务受到影响。
如何调优,正如问题1所说,这里细化一下:

四、elasticsearch是如何实现master选举的?
解答:
前置前提:

1)只有候选主节点(master:true)的节点才能成为主节点。
2)最小主节点数(min_master_nodes)的目的是防止脑裂。

这个我看了各类网上分析的版本和源码分析的书籍,云里雾里。
核对了一下代码,核心入口为findMaster,选择主节点成功返回对应Master,不然返回null。选举流程大体描述以下:

第一步:确认候选主节点数达标,elasticsearch.yml设置的值discovery.zen.minimum_master_nodes;
第二步:比较:先断定是否具有master资格,具有候选主节点资格的优先返回;若两节点都为候选主节点,则id小的值会主节点。注意这里的id为string类型。

五、详细描述一下Elasticsearch搜索的过程?
面试官:想了解ES搜索的底层原理,再也不只关注业务层面了。
解答:
搜索拆解为“query then fetch” 两个阶段。
query阶段的目的:定位到位置,但不取。
步骤拆解以下:

1)假设一个索引数据有5主+1副本 共10分片,一次请求会命中(主或者副本分片中)的一个。
2)每一个分片在本地进行查询,结果返回到本地有序的优先队列中。
3)第2)步骤的结果发送到协调节点,协调节点产生一个全局的排序列表。

fetch阶段的目的:取数据。
路由节点获取全部文档,返回给客户端。
六、Elasticsearch在部署时,对Linux的设置有哪些优化方法?
面试官:想了解对ES集群的运维能力。
解答:

1)关闭缓存swap;
2)堆内存设置为:Min(节点内存/2, 32GB);
3)设置最大文件句柄数;
4)线程池+队列大小根据业务须要作调整;
5)磁盘存储raid方式——存储有条件使用RAID10,增长单节点性能以及避免单节点存储故障。

七、lucence内部结构是什么?
解答:

Lucene是有索引和搜索的两个过程,包含索引建立,索引,搜索三个要点。能够基于这个脉络展开一些。

什么是sso系统
单点登陆是在多个应用系统中,用户只须要登陆一次就能够访问全部相互信任的应用系统。
登陆的处理流程:
一、登陆页面提交用户名密码。
二、登陆成功后生成token。Token至关于原来的jsessionid,字符串,可使用uuid。
三、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。
四、使用String类型保存Session信息。可使用“前缀:token”为key
五、设置key的过时时间。模拟Session的过时时间。通常半个小时。
六、把token写入cookie中。
如何判断是否登陆
1.从cookie中取token
2.取不到未登陆
3.取到token,到redis中查询token是否过时
4.若是过时,为登陆状态
5.没有过时,登陆状态

实现购车商品数据同步
一、要求用户登陆。
二、把购物车商品列表保存到数据库中。推荐使用redis。
三、Key:用户id,value:购车商品列表。推荐使用hash,hash的field:商品id,value:商品信息。
四、在用户未登陆状况下写cookie。当用户登陆后,访问购物车列表时,
a)把cookie中的数据同步到redis。
b)把cookie中的数据删除
c)展现购物车列表时以redis为准。
d)若是redis中有数据cookie中也有数据,须要作数据合并。相同商品数量相加,不一样商品添加一个新商品。
五、若是用户登陆状态,展现购物车列表以redis为准。若是未登陆,以cookie为准。

浏览器跨域问题
跨域是指从一个域名的网页去请求另外一个域名的资源。浏览器出于安全的考虑,不容许不一样源的请求
JSONP解决AJAX跨域问题:
JSONP是服务器与客户端跨源通讯的经常使用方法。最大特色就是简单适用,老式浏览器所有支持,服务器改造很是小。
它的基本思想是,网页经过添加一个

海量数据的存储问题
现在随着互联网的发展,数据的量级也是呈指数的增加,从GB到TB到PB。对数据的各类操做也是越发的困难,传统的关系性数据库已经没法知足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它经过下降数据的安全性,减小对事务的支持,减小对复杂查询的支持,来获取性能上的提高。
可是,在有些场合NoSQL一些折衷是没法知足使用场景的,就好比有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL确定是没法知足的,因此仍是须要使用关系性数据库。若是使用关系型数据库解决海量存储的问题呢?此时就须要作数据库集群,为了提升查询性能将一个数据库的数据分散到不一样的数据库中存储。

什么是数据库分片
简单来讲,就是指经过某种特定的条件,将咱们存放在同一个数据库中的数据分散存放到多个数据库上面,以达到分散单台设备负载的效果。
数据的切分(Sharding)根据其切分规则的类型,能够分为两种切分模式。
1.一种是按照不一样的表来切分到不一样的数据库(主机)之上,这种切能够称之为数据的垂直切分
2.另一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库上面,这种切分称之为数据的水平切分。

如何实现数据库分片
当数据库分片后,数据由一个数据库分散到多个数据库中。此时系统要查询时须要切换不一样的数据库进行查询,那么系统如何知道要查询的数据在哪一个数据库中?当添加一条记录时要向哪一个数据库中插入呢?这些问题处理起来都是很是的麻烦。
这种状况下可使用一个数据库中间件mycat来解决相关的问题。

什么是Mycat?
简单的说,MyCAT就是:一个新颖的数据库中间件产品,支持mysql集群,提供高可用性数据分片集群。你能够像使用mysql同样使用mycat。对于开发人员来讲根本感受不到mycat的存在。
Mycat读写分离
数据库读写分离对于大型系统或者访问量很高的互联网应用来讲,是必不可少的一个重要功能。对于MySQL来讲,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,一般是1-3个读节点的配置

电商活动倒计时方案(秒杀方案):
一、肯定一个基准时间。可使用一个sql语句从数据库中取出一个当前时间。SELECT NOW();
二、活动开始的时间是固定的。
三、使用活动开始时间-基准时间能够计算出一个秒为单位的数值。
四、在redis中设置一个key(活动开始标识)。设置key的过时时间为第三步计算出来的时间。
五、展现页面的时候取出key的有效时间。Ttl命令。使用js倒计时。
六、一旦活动开始的key失效,说明活动开始。
七、须要在活动的逻辑中,先判断活动是否开始。
秒杀方案:
八、把商品的数量放到redis中。
九、秒杀时使用decr命令对商品数量减一。若是不是负数说明抢到。
十、一旦返回数值变为0说明商品已售完。
因为宜立方商城是基于SOA的架构,表现层和服务层是不一样的工程。因此要实现商品列表查询须要两个系统之间进行通讯。

如何实现远程通讯?
一、Webservice:效率不高基于soap协议。项目中不推荐使用。
二、使用restful形式的服务:http+json。不少项目中应用。若是服务太多,服务之间调用关系混乱,须要治疗服务。
三、使用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.有序集合(问深一点可能会问道底层数据结构,以及每种数据结构经常使用情景)这里也能够列举一些:

应用场景

计数器
数据统计的需求很是广泛,经过原子递增保持计数。例如,点赞数、收藏数、分享数等。
排行榜
排行榜按照得分进行排序,例如,展现 近、 热、点击率 高、活跃度 高等等条件的top list。
用于存储时间戳
相似排行榜,使用redis的zset用于存储时间戳,时间会不断变化。例如,按照用户关注用户的 新动态列表。记录用户断定信息
记录用户断定信息的需求也很是广泛,能够知道一个用户是否进行了某个操做。例如,用户是否点赞、用户是否收藏、用户是否分享等。
社交列表
社交属性相关的列表信息,例如,用户点赞列表、用户收藏列表、用户关注列表等。
缓存
缓存一些热点数据,例如,PC版本文件更新内容、资讯标签和分类信息、生日祝福寿星列表。
队列
Redis能做为一个很好的消息队列来使用,经过list的lpop及lpush接口进行队列的写入和消费,自己性能较好能解决大部分问题。可是,不提倡使用,更加建议使用rabbitmq等服务,做为消息中间件。
会话缓存 使用Redis进行会话缓存。例如,将web session存放在Redis中。
业务使用方式
String(字符串): 应用数, 资讯数等, (避免了select count(*) from …)
Hash(哈希表): 用户粉丝列表, 用户点赞列表, 用户收藏列表, 用户关注列表等。
List(列表):消息队列, push/sub提醒。
SortedSet(有序集合):热门列表, 新动态列表, TopN, 自动排序。

Redis集群中,某个节点宕机怎么办?你碰见过吗?你的解决思路是什么?
redis集群:通常的是至少是2台服务器,主从服务器!若是redis集群的主服务器挂了,没有关系还有备服务器

(哨兵模式和集群模式)

中间件问题

AcitveMQ的做用、原理、特色?(生产者。消费者。 p2p、订阅实现流程)
Activemq的做用就是系统之间进行通讯。固然可使用其余方式进行系统间通讯,若是使用Activemq的话能够对系统之间的调用进行解耦,实现系统间的异步通讯。原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,而后查看有多少个消费者,而后把消息转发给消费者,此过程当中生产者无需参与。消费者接收到消息后作相应的处理和生产者没有任何关系。

ActiveMQ若是数据提交不成功怎么办?
Activemq有两种通讯方式,点到点形式和发布订阅模式。若是是点到点模式的话,若是消息发送不成功此消息默认会保存到activemq服务端知道有消费者将其消费,因此此时消息是不会丢失的。
若是是发布订阅模式的通讯方式,默认状况下只通知一次,若是接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的状况。若是要求消息必须送达不能够丢失的话,须要配置持久订阅。每一个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时须要配置发送模式为持久化。此时若是客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。

此处可能会问各类消息中间件的区别以及应用场景,即RabbitMQ、Kafka、RocketMQ之间的区别,以及里面的组件,好比我遇到过被问到RabbitMQ里面五种模式的具体写法与区别

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拥有独立

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

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

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

各模块是怎么设计的,如商品参数,广告位等,数据库设计思路。。。

总的来讲调用和设计上的问的较多,以及秒杀,比较多的是细节,好比秒杀中遇到的一些问题,怎么解决之类的