2018年的阿里巴巴第三轮面试,面试题汇总

面试大概7个问题,虽然结果以失败告终,但是我觉得很不服气(不好意思,就是这么直性子),所以发出来让大家看一看。

注:有的回答可能不正确,或者不完整,别的同学不要拿去直接用。

一上来自我介绍:。。。

问题1: HBase和mysql的区别
HBase基于列存储,查询中的选中规则是通过列来定义,因此整个数据库是自动索引化的。HBase无需考虑分库、分表,它可以对存储的数据自动切分数据,并支持高并发读写操作,使得海量数据存储自动具有更强的扩展性。 但是HBase不包含事务,没有表与表之间关联查询,
mysql基于行存储, mysql的innodb引擎带事务控制,表之间的join比较方便;伸缩性比较差。

问题2 : dubbo服务中,1500tps的服务A好2000tps的服务b同时调用服务c,如何实现在两台服务器上独立调用
我回答使用dubbo自带的一致性hash负载均衡。

问题3 : mysql如何自己实现读写分离
我说的是一般两种方式,在应用层实现,或者使用中间件如cobra, amoeda。
mysql自己实现,这个我说没听说过,没答出来。

问题4: cobar, Amoeba 原理
直接回答,原理不知道,接着回答:
Amoeba处于应用程序和数据库服务器之间,充当一个中间代理层。其支持负载均衡、高可用、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

问题5: 如何在应用层实现mysql读写分离
这个就是平时用到的,所以说的比较详细:
总的来说,在进入Service之前,使用AOP来做出判断,是使用写库还是读库,判断依据可以根据方法名判断,比如说以query、find、get等开头的就走读库,其他的走写库。
(1)写一个DynamicDataSource类 继承Spring的AbstractRoutingDataSource,只要实现determineCurrentLookupKey方法即可。
(2)再写一个类DynamicDataSourceHolder,使用ThreadLocal技术来记录当前线程中的数据源的key;
(3)订阅数据源的AOP切面,通过Service的方法名判断是应该走读库还是写库;
(4)Spring的配置文件中配置数据源DataSource为自定义的DynamicDataSource,定义连接池,配置jdbc.properties;
(5)配置事务管理以及动态切换数据源切面。

问题6: redis的list如何在分布式环境上缓存
我回答不知道,但是我知道redis上的sorted set数据结构的使用和原理。
set 可以通过用户额外提供一个优先级 (score) 的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,可以选择 sorted。比如想要获取自动按照时间排好序的帖子,就可以用帖子发表时间作为score来存储。
实现方式:
  Redis sorted set的内部使用 HashMap 和跳跃表 (SkipList) 来保证数据的存储和有序, HashMap 里放的是成员到 score 的映射,而跳跃表里存放的 是所有的成员,排序依据是 HashMap 里存的 score, 使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。

问题7: 分库分表时的一致性hash算法
对节点和数据,都做一个哈希运算,然后比较节点和数据的哈希值,数据取和节点最相近的节点作为存放节点。这样就保证当节点增加或者减少的时候,影响的数据最少。
一种简单的办法,给每个真实结点后面根据虚拟节点加上后缀再取Hash值,比如"192.168.0.0:111"就把它变成"192.168.0.0:111&&VN0"到"192.168.0.0:111&&VN4",VN就是Virtual Node的缩写,还原的时候只需要从头截取字符串到"&&"的位置就可以了。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值