面试实题:No.15

1、redis集群搭建了几台,如何搭建的?

根据实际开发情况来说。各个公司搭建集群使用的数量不一样,数量都是奇数,最少为三台,分为服务,热备,检修,也有可能这三种各自为一个集群

搭建的步骤通常在网上可以查找:一般情况下有下载,安装,创建路径,修改配置文件,然后启动。

2、为什么要用redis?有什么好处?

1:键-值存储 通常被称作是一款数据结构服务器

2:支持的数据类型:字符串、哈希、列表、集合、有序集合等 。对这些数据类型,可以执行原子操作。

3:为了获得优异的性能,redis采用内存中数据集的方式。

4:redis支持数据的持久化,可以每个一段时间将数据转存到磁盘上,或在日志尾部追加一条操作命令。

5:redis支持主从复制,并具有非常快速的非阻塞的首次同步、网络断开自动重连等功能。

6:redis的一些其他功能:简单的事务支持、发布订阅、管道、虚拟内存等。

3、如何来维护集群之间的关系,或者说集群之间如何建立连接

Redis集群之间是自维护,项目中的集群指的是dubbo和zookeeper,dubbo是通过zookeeper来维护的。

4、单点登录有没有权限校验,具体怎么做,每个系统都调用findOne()查询方法?那他们查询的是数据库中都是查询一张表吗?如果每个系统都需要调用findOne()那单点登录有何意义?就是单纯的用户体验性好?findOne需要查询用户表,如果数据库搭的集群,怎样保证数据的同步(中途对数据进行修改)

当发现用户未登录的时候,跳转到单点登录页面,并在URL参数里添加一个返回地址;单点登录页面有用户的cookies,如果已登陆则直接跳转回来并且在URL参数里添加上登录信息,如果未登录则引导用户登录,然后将登录信息附加在URL参数里,调用callback地址,回到跳转前的页面;跳转前的页面接收到URL参数后,调用SSO的接口,验证登录信息,获取token并保存到session或者cookies,之后可以使用token调用其他子系统。

5、ActiveMQ:说说activeMQ调用流程结合模块说一下

发送消息的基本步骤: 

(1)创建连接使用的工厂类 JMS ConnectionFactory。

(2)使用管理对象JMS ConnectionFactory建立连接Connection,并启动。

(3)使用连接Connection建立会话Session。

(4)使用会话Session和管理对象Destination创建消息生产者MessageSender。

(5)使用消息生产者MessageSender发送消息

消息接收者从JMS接收消息的步骤:

(1)创建连接使用的工厂类JMS ConnectionFactory。

(2)使用管理对象JMS ConnectionFactory建立连接Connection,并启动。

(3)使用连接Connection建立会话Session。

(4)使用会话Session和管理对象Destination创建消息接收者MessageReceiver。

(5)使用消息接收者MessageReceiver接收消息,需要用setMessageListener将MessageListener接口绑定到MessageReceiver,消息接收者必须实现了MessageListener接口,需要定义onMessage事件方法。

6、商家修改商品价格,然后购物车里的redis更新?就是清空redis,下次查询商品数据查询数据库,那这个购物车信息,你们在数据库中也有保存?如果商家仅仅修改了一条数据,你就把该用户的该条购物车信息全部清空?

我们自己所做的商家修改价格,购物车里的信息并不更新,而是在用户订单生成的时候根据id再次重新查询价格,购物车的信息在数据库中。如是要让数据更新,我们可以尝试着用MQ去同步数据

7、Redis挂掉后怎么办?介绍先redis是怎么实现高可用的?

主要取决于,你是把redis作为缓存还是nosql,如果是缓存那丢了也无所谓,从别的地方恢复重建就行了,如果是nosql的话,redis是有snapshot和aof的机制来保证数据持久化的。另一个发面是否搭建了redis集群,若是主机宕机,可以使用备机。

8、如果项目已经上线了你,但是出现了问题。主要是怎么解决,或者你们怎样找出问题所在的(日志方向),这块你接触过吗?

通过引用log4j日志包来查看,在每个类中引用相应的日志来记录,在服务器中留出专门的空间来存储日志,后缀为.log的文件,出现的错误会存储到日志文件中,当我们需要查看的时候通过编译软件来查看。实际开发中,这一块一般都是运维人员负责的。

9、购物车如何做的?

购物车功能分两种状态,未登录状态购物车和已登录状态购物车。

未登录状态购物车:

利用cookie中的value(value可以是一个uuid来保证唯一性)再加上一个前缀比如REDIS_CART做为redis的key,然后将购物车数据转成json存入到redis中。这样就达到了京东的未登录状态下加入商品到购物车的类似功能。

但是这样存数据的话,如果购物车中有很多个商品,而之后要修改购物车中某个商品的数量,我们就需要将所有的商品取出来遍历、判断、修改然后再重新转换成json再存入到redis中,这样就有点麻烦。因此就采用了redis中的hash结构的存储方式。

它的结构方式是:

 

那么我们怎么存储比较好呢?

redis-key保持不变,然后可以将itemId作为字段,然后将数据存入到value中。

如:

     

如果需要修改商品数量的话直接可以通过itemId找到对应的商品修改而不需要全部取出了。

在购物车页面我们可以通过勾选前面的复选框来选择需要的商品进行下单,怎么实现呢,如果复选框被勾选了,在提交页面的时候将对应的商品id一起提交,如果全选,那就不用提交商品id,那么在提交订单时我们只要进行判断,如果传递了商品id,那么就指定商品下单,如果没有提交商品id,那么就通过用户id(在提交订单时用户肯定已经登录了)查询其下的所有订单进行全部下单。

登录状态购物车:

当我们在未登录状态下下单的时候,会跳转到登录页面,让用户先登录,这时我们就要考虑将未登录状态下的购物车数据在登录后合并到一起。

那么登录之后的合并数据的逻辑应该写在哪儿呢,由于登录功能是单独的一个工程,因此我利用了MQ的技术,在用户登录成功之后,发送消息,然后在购物车系统中监听到消息之后再处理数据合并。而消息内容一个是userId,用来确定合并之后的数据保存在哪个用户的购物车中,另一个就是cookie中的uuid?通过uuid查询到该用户在未登录状态下的购物车数据(之前购物车的优化,已经把未登录状态下的购物车数据存储到了redis中,而redis的key就是这个uuid,如果用户登录之后携带的cookie中的uuid和redis的key一致,那是不是就可以合并了),然后进行数据的合并,那这个功能也就可以完成了。

需要注意的是,我们合并数据之后是不是还要把redis中的购物车数据删除掉,如果不删除的话,下次登录是不是又要合并了。

当我们下单之后,应该要将购物车里的数据删除掉,如果不删除的话下一下单购物车里的数据就又会增加上去了。

下单流程:从前台工程-taotaoweb请求到订单工程-taotao-order,然后将数据保存的数据库中。

taotao-web--------taotao-order--------DB数据库

那我们考虑一下,删除购物车逻辑应该写到哪儿呢,taotao-web还是taotao-order呢?

是不是写在taotao-order中比较合理呢,没错,可以在taotao-order中通过调用taotao-cart的接口来实现删除购物车逻辑。但是有没有什么问题?是不是耦合度比较高啊,那怎么解决呢?就是利用MQ,这里也是一样,在订单生成后,我们可以发送一个消息出去,然后通知taotao-cart工程,taotao-cart通过监听这个消息将用户的购物车数据删除。那么发送的消息内容是什么,什么是必须的,userId是不是必须的,还有itemId,是不是有这两个就可以了。其他所有数据是不是都可以通过这两个id来查询出来。

这里有个问题,我们现在删除的是登录状态下的购物车,那么未登录状态下的购物车是不是要删除?不用吧,我们在登录的时候是不是已经将未登录状态中的购物车数据合并了啊,一旦合并之后,就会将未登录状态的购物车数据删除。

10、项目大概做了多久,项目团队人数,及其各岗位的人数 

最后一个电商项目做了四个月左右,我在离职的时候已经接近收尾阶段,我们项目团队一共有13个人, 前端2个,后台4个,UI1个,架构师1个,产品经理1个,产品专员1个,项目经理1个,测试2个。

发布了441 篇原创文章 · 获赞 1021 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/A_BlackMoon/article/details/104789213