快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

关于淘淘商城面试的一些问题

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

1.如果数据库的信息更改以后,那么索引库和缓存库里面的信息是怎么更新的?不可能每次都去访问数据库吧?

  • 该问题前提是商品详情页面如果采取的是缓存商品数据这种设计的话,那么当商品信息更改以后,索引和缓存中数据更新同步逻辑在淘淘商城中设计是采取了发mq异步从数据库中查询的。如果从数据库中根据发mq发来的商品主键id来查询数据库不是不可以。如果数据库查询很慢,性能很低,那么就设计到优化该逻辑的设计了。比如:是否可以采取新增商品临时表,发的mq就从临时表中去取;还比如索引和缓存的数据不多,我也可以直接通过mq把商品内容发过来啊。我甚至,可以不采用发mq直接去同步。

2.消息队列MQ,如果消息丢失了怎么办,我怎么能知道消息有没有丢失,遇到这种问题我怎么处理?

  • 消息丢失可以分为消息生产者丢失和消息消费者丢失;消息丢监控中心看不到消息,且会报异常。常规做法是开启事务+设置持久化。

在这里插入图片描述

  • 注意对于业务中依赖消息的高密度,高并发的场景,我们推荐使用RabbitMQ,该mq提供了解决生成者和消费者消息丢失的解决方案;主要思路主要是放在怎么确认消息已经收到,也就是针对不同生产者和消费者提供了确认机制.请参考:http://www.cnblogs.com/Leo_wl/p/6581989.html
  • 还可以设计一张路由表,消费者消费成功之后就会修改该表中记录状态

3.如果两个人,两台电脑同时登录同一个帐号,同时对同一个账单提交,账单同时被服务器处理,那服务器应该先处理谁的,或者怎么规避这个问题。非单点登录,重定向,stoken拦截器的问题?

  • 现在购物app和desktop都会同时存在,且有的电商是允许统一账号在不同电商上登录的。以京东为例,在本地不同电脑使用同一个账号登录,是可以的。

  • 通过实际演示,A,B两台电脑登录同一个账号,同时对同一件商品提交订单时,如果A电脑先下订单,那么B再下订单也会产生订单。这就好比你买了2件商品一样,实际过程中京东没有因为是同一账号,不同电脑上提交同一商品而规避用户重复购买。因为下订单也是先后顺序的。

  • 通过实际演示,A,B两台电脑登录同一个账号,对同一件商品同时删除,如果A电商先删除该商品,B电脑再删除该商品,那么B电商点击删除操作之后,会弹出删除失败提示框。

  • 通过springmvc的HandlerInterceptor拦截器配置,preHandle()方法去检查客户机请求是否携带token,京东就是这样做的。

4.用户购买商品时,什么时候才减少库存?

  • 提交订单,支付状态由未付款改成支付成功后,才会减少库存。仓库系统不会根据用户临时行为去减少库存商品数量。这样带来的数据变动太大。而是会根据下单后商品支付成功状态来减少库存。

5.日志文件的管理

  • 一般大型的电商系统都会将各个子系统的中后台操作进行监控,随时能够查看系统运行状态。那么其后台管理系统的日志可以设计日志表来专门存储后台操作。这一类日志称之为自定义日志信息;

  • 除此之外,还有我们各个服务产生的日志,例如tomcat,solr等日志这些日志也可以分布式日志框架收集。

  • 将我们自定的日志信息和系统服务日志信息收集之后,就可以通过日志架构,来搭建日志管理系统了。这些日志信息可以都存储在日志服务器中。有专门的报表及其报警系统组成。

6.项目中用到了多少台服务器,测试环境和正式环境各有多少台

  • 一个门户网站的uv量月统计达到几十万,至少也得部署4台,这样也能够应对理论值1000-2000并发量。另外还得看服务器性能和架构,所以单纯要问有多少台,没有多少意义。真要是说,将项目定位成小型-中型-大型-超大型系统。那么算上其他系统所需要的服务器依次需要4-6台—6-10台—至少20台—数据节点,上千。
  • 测试环境主要是供RD和QA使用,一般都会各自分配一台。正式环境就是上面所说的了。

7.商品修改以后,购物车里面的价格是怎么处理的?
该问题假设的情景是用户添加了一件商品,那么此时商品价格修改了。此时下订单以什么为准?该问题分为下订单前和下订单后。

  • 一旦下了订单,那么订单中就有了该商品的金额,即使修改了商品价格,也是按照订单来支付的。
  • 如果没有下订单,那么在下订单的时候,是按照最新修改的商品价格来计算该商品金额的。

8.商品修改之后,需要同步的是什么? 怎么同步的?

  • 如果按照淘淘商城中,新增商品同步到solr索引,同步到redis中。那么就可以在修改商品的时候,add(document),set(item)。淘淘商城中采取的策略是发mq,根据id查询,这种方式去同步的,对于redis就是直接删除,然后新增。

9.在项目中并发是怎么解决的,用到哪些技术,具体是怎么实现的,原理是什么!

  • 购买高性能服务器和数据库(不能从根本上解决高并发)

  • 页面静态化处理
    静态化页面效率高消耗最小,避免大量数据库访问量。

  • 图片服务器分离(基本网站都采取的策略)
    使用独立的图片服务器降低提供页面访问请求的服务器系统压力并且可以保证系统不会因为图片问题而崩溃,在应用服务器和图片服务器上,可以进行不同的配置优化。

  • 集群架构
    增加一台服务器分担原有服务器访问和存储压力来改善负载压力。比较成熟的集群架构要保证可伸缩性。

  • 负载均衡(软件和硬件的负载,一般使用软件负载更多)
    可将用户浏览器访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多用户,就在集群中加入更多的服务器,使用应用服务器服务器的负载压力不再成为整个网站的瓶颈。

  • 特定业务功能可以考虑使用多线程去处理

  • 缓存 减少数据库访问压力

  • 读写分离,分库分表

  • 代码优化

10.dubbo服务开发流程,运行流程?zookeeper注册中心的作用?

  • 使用流程: 第一步:要在系统中使用dubbo应该先搭建一个注册中心,一般推荐使用zookeeper。 第二步:有了注册中心然后是发布服务,发布服务需要使用spring容器和dubbo标签来发布服务。并且发布服务时需要指定注册中心的位置。
    第三步:服务发布之后就是调用服务。一般调用服务也是使用spring容器和dubbo标签来引用服务,这样就可以在客户端的容器中生成一个服务的代理对象,在action或者Controller中直接调用service的方法即可。
  • Zookeeper注册中心的作用主要就是注册和发现服务的作用,在系统中并不参与服务的调用及数据的传输。

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

  • Redis是key-value形式的nosql数据库。可以快速的定位到所查找的key,并把其中的value取出来。拿商品数据来说,key就是商品id,value是商品相关信息的json数据。并且redis的所有的数据都是放到内存中,存取的速度非常快0,一般都是用来做缓存使用。
  • 项目中使用redis一般都是作为缓存来使用的,缓存的目的就是为了减轻数据库的压力提高存取的效率。
  • 在互联网项目中只要是涉及高并发或者是存在大量读数据的情况下都可以使用redis作为缓存。当然redis提供丰富的数据类型,除了缓存还可以根据实际的业务场景来决定redis的作用。例如使用redis保存用户的购物车信息、生成订单号、访问量计数器、任务队列、排行榜等。

12.Redis在其中起了什么作用?

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

13.redis支持五种数据类型存储:1.字符串2.散列3.列表4.集合5.有序集合(问深一点可能会问道底层数据结构,以及每种数据结构常用情景)这里也可以列举一些应用场景

  • 计数器
    数据统计的需求非常普遍,通过原子递增保持计数。例如,点赞数、收藏数、分享数等。
  • 排行榜
    排行榜按照得分进行排序,例如,展示 近、 热、点击率 高、活跃度 高等等条件的top list。
  • 用于存储时间戳
    类似排行榜,使用redis的zset用于存储时间戳,时间会不断变化。例如,按照用户关注用户的 新动态列表。
  • 记录用户判定信息
    记录用户判定信息的需求也非常普遍,可以知道一个用户是否进行了某个操作。例如,用户是否点赞、用户是否收藏、用户是否分享等。
  • 社交列表
    社交属性相关的列表信息,例如,用户点赞列表、用户收藏列表、用户关注列表等。
  • 缓存
    缓存一些热点数据,例如,PC版本文件更新内容、资讯标签和分类信息、生日祝福寿星列表。
  • 队列
    Redis能作为一个很好的消息队列来使用,通过list的lpop及lpush接口进行队列的写入和消费,本身性能较好能解决大部分问题。但是,不提倡使用,更加建议使用rabbitmq等服务,作为消息中间件。
  • 会话缓存
    使用Redis进行会话缓存。例如,将web session存放在Redis中。

14.业务使用方式

String(字符串): 应用数, 资讯数等, (避免了select count(*) from …)
Hash(哈希表):用户粉丝列表, 用户点赞列表, 用户收藏列表, 用户关注列表等。
List(列表):消息队列, push/sub提醒。
SortedSet(有序集合):热门列表, 新动态列表, TopN, 自动排序。

15.acitveMQ的作用、原理?(生产者。消费者。 p2p、订阅实现流程)

  • Activemq的作用就是系统之间进行通信。当然可以使用其他方式进行系统间通信,如果使用Activemq的话可以对系统之间的调用进行解耦,实现系统间的异步通信。原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,然后查看有多少个消费者,然后把消息转发给消费者,此过程中生产者无需参与。消费者接收到消息后做相应的处理和生产者没有任何关系。

16.activeMQ在项目中如何应用的?

  • Activemq在项目中主要是完成系统之间通信,并且将系统之间的调用进行解耦。例如在添加、修改商品信息后,需要将商品信息同步到索引库、同步缓存中的数据以及生成静态页面一系列操作。在此场景下就可以使用activemq。一旦后台对商品信息进行修改后,就向activemq发送一条消息,然后通过activemq将消息发送给消息的消费端,消费端接收到消息可以进行相应的业务处理。

17activeMQ如果数据提交不成功怎么办?

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

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

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

19.solr的原理

  • Solr是基于Lucene开发的全文检索服务器,而Lucene就是一套实现了全文检索的api,其本质就是一个全文检索的过程。全文检索就是把原始文档根据一定的规则拆分成若干个关键词,然后根据关键词创建索引,当查询时先查询索引找到对应的关键词,并根据关键词找到对应的文档,也就是查询结果,最终把查询结果展示给用户的过程。

20.solr里面IK分词器的原理

  • IK分析器的分词原理本质上是词典分词。先在内存中初始化一个词典,然后在分词过程中逐个读取字符,和字典中的字符相匹配,把文档中的所有的词语拆分出来的过程。

21.支付接口是怎么做的?

  • 面试中可以说支付这部分不是我们做的,我们项目中并没有涉及支付部分的处理。如果想了解支付是如何实现可以参考之前学过的易宝支付相关处理以及支付宝、微信支付相关文档。
    支付宝:
    https://doc.open.alipay.com/doc2/apiDetail.htmspm=a219a.7629065.0.0.eeTXH8&apiId=850&docType=4#
    微信支付:
    https://mp.weixin.qq.com/cgi-bin/readtemplatet=business/faq_tmpl

22.当被问到某个模快存在安全性问题(sso单点登录系统)时,如何回答?

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

23.业务如何说?先说业务、说表、说具体实现?

  • 先说总体的业务流程,然后再说具体业务的实现方法及使用的技术。最后说你在系统中负责的内容。不需要说表结构。

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

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

25.你购物车存cookie里边 可以实现不登录就可以使用购物车 那么我现在没有登录把商品存购物车了 然后登录了 然后我换台电脑并且登录了还能不能看见我购物车的信息?如果看不到怎么做到cookie同步,就是在另外一台电脑上可以看到购物车信息?

  • 淘淘商城现阶段使用的仅仅是把购物车的商品写入cookie中,这样服务端基本上么有存储的压力。但是弊端就是用户更换电脑后购物车不能同步。打算下一步这么实现:当用户没有登录时向购物车添加商品是添加到cookie中,当用户登录后购物车的信息是存储在redis中的并且是跟用户id向关联的,此时你更换电脑后使用同一账号登录购物车的信息就会展示出来。

26.如果用户一直添加购物车添加商品怎么办?并且他添加一次你查询一次数据库?互联网上用户那么多,这样会对数据库造成很大压力你怎么办?

  • 当前我们使用cookie的方式来保存购物车的数据,所以当用户往购物车中添加商品时,并不对数据库进行操作。将来把购物车商品放入redis中,redis是可以持久化的可以永久保存,此时就算是频繁的往购物车中添加数据也没用什么问题。

27.电商活动倒计时方案

  1. 确定一个基准时间。可以使用一个sql语句从数据库中取出一个当前时间。SELECT NOW();

  2. 活动开始的时间是固定的。

  3. 使用活动开始时间-基准时间可以计算出一个秒为单位的数值。

  4. 在redis中设置一个key(活动开始标识)。设置key的过期时间为第三步计算的时间。

  5. 展示页面的时候取出key的有效时间。Ttl命令。使用js倒计时。

  6. 一旦活动开始的key失效,说明活动开始。

  7. 需要在活动的逻辑中,先判断活动是否开始。

28.秒杀抢购库存解决方案

  • 把商品的数量放到redis中。秒杀时使用decr命令对商品数量减一。如果不是负数说明抢到。一旦返回数值变为0说明商品已售完。

29.你们做移动端没有,如果没有移动端,你们为什么做单点登录?

  • 单点登录并不是为移动端准备的,移动端有自己的登录方式。单点登录是解决在同一个公司内部多个互信网站之间进行跳转时不需要多次登录,多个系统统一登录入口。

30.单点登录的核心是什么?

  • 单点登录的核心是如何在多个系统之间共享身份信息。

31.商品存入数据库怎么保证数据库数据安全

  1. 对用户安全管理
    用户操作数据库时,必须通过数据库访问的身份认证。删除数据库中的默认用户,使用自定义的用户及高强度密码。
  2. 定义视图
    为不同的用户定义不同的视图,可以限制用户的访问范围。通过视图机制把需要保密的数据对无权存取这些数据的用户隐藏起来,可以对数据库提供一定程度的安全保护。实际应用中常将视图机制与授权机制结合起来使用,首先用视图机制屏蔽一部分保密数据,然后在视图上进一步进行授权。
  3. 数据加密
    数据加密是保护数据在存储和传递过程中不被窃取或修改的有效手段。
  4. 数据库定期备份

32.订单表的数据量太大,我把订单分到许多表中,那么我想用一条sql查处所有的订单,怎么解决

  • 分库情况下:可以使用mycat数据库中间件实现多个表的统一管理。虽然物理上是把一个表中的数据保存到多个数据库中,但是逻辑上还是一个表,使用一条sql语句就可以把数据全部查询出来。

  • 单库情况下:需要动态生成sql语句。先查询订单相关的表,然后将查询多个表的sql语句使用union连接即可。

38.第一个是当两个客户同时买一件商品时库存只有一个了,怎么控制

  • 可以使用mysql的行锁机制,实现乐观锁,在更新商品之前将商品锁定,其他用户无法读取,当此用户操作完毕后释放锁。当并发量高的情况下,需要使用缓存工具例如redis来管理库存。

39.对数据库只是采用了读写分离,并没有完全解决数据库的压力,那么有什么办法解决

  • 如果数据库压力确实很大的情况下可以考虑数据库分片,就是将数据库中表拆分到不同的数据库中保存。可以使用mycat中间件。

40.solr的索引查询为什么比数据库要快

  • Solr使用的是Lucene API实现的全文检索。全文检索本质上是查询的索引。而数据库中并不是所有的字段都建立的索引,更何况如果使用like查询时很大的可能是不使用索引,所以使用solr查询时要比查数据库快。

41.什么是负载均衡高可用?

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

42.什么是FastDFS?

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

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

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

44.什么是sso系统?

  • 单点登录是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。 登录的处理流程:
    1、登录页面提交用户名密码。
    2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。
    3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。
    4、使用String类型保存Session信息。可以使用”前缀:token”为key
    5、设置key的过期时间。模拟Session的过期时间。一般半个小时。 6、把token写入cookie中。

45.如何判断是否登录?

  • 1.从cookie中取token
    2.取不到未登录
    3.取到token,到redis中查询token是否过期
    4.如果过期,为登录状态
    5.没有过期,登录状态

46.实现购车商品数据同步

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

47.浏览器跨域问题

  • 跨域是指从一个域名的网页去请求另一个域名的资源。浏览器出于安全的考虑,不允许不同源的请求 JSONP解决AJAX跨域问题: JSONP是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,老式浏览器全部支持,服务器改造非常小。
    它的基本思想是,网页通过添加一个
     
    QQ在线咨询
    售前咨询热线
    QQ1922638