最近这段时间因为自身的一些原因,阿粉想着年前把自己公司的事情处理好之后,然后准备准备面试,刚刚把简历弄好,然后发布出去之后,就接到了面试的电话,而电话面完之后,现场面试却是一再出现尴尬的情况,事情是这个样子的。

<–more–>

事情起末

阿粉因为准备换工作,于是开始着手准备自己的简历,于是就在简历上写了项目中目前使用的技术,比如,Redis,Http协议,爬虫,以及ES等等,前端的话,就写了关于 Angular,Vue,因为之前使用过的确实是这几种,弄好了之后,看了看没啥问题之后,就公开了,于是就接到了电话。

面试官:请问你是xxx吗?

阿粉:是的。

面试官:你最近是有换工作的打算是么?

阿粉:对,现在正在考虑,现在是在职,已经提了离职,正在做交接。

嗯?开头是这个样子的么?难道不应该是先说个您好么?打扰了之类的?(电话那头是个男的,之后的面试发现,是只有5个人的小作坊)。

当阿粉说完之后,接下来的话,虽然他不尊重咱们,咱们得自己做好自己不是?于是接下来的电话技术面试就开始了。

面试官:数据库事务的特性以及他们的隔离级别都有哪些?

当时阿粉也是听到就蒙了,这啥都没有,电话直接就开始了?一个大大的问号在脑海中出现,但是咱们还是得给他说呀,于是技术来了

阿粉回答: 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:

  • 原子性(Atomicity)

  • 一致性(Consistency)

  • 隔离性(Isolation)

  • 持久性(Durability)

原子性就是指事务包含的所有操作要么全部成功,要么全部失败回滚。

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

隔离性是当多个用户并发访问数据库时,不同的事务之间不受干扰,相互隔离。

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的改变,也就是说就算数据库出现了什么系统故障,也不会导致丢失提交事务的操作。

阿粉在回答完之后,就只是说了四个特性,没有专门的去解读这个他们是什么意思,而之后的解读也是他追问的,特性都代表什么意思之后,才继续回答的,那么事务的隔离级别都有哪些?

  • 读未提交 (read uncommitted)

  • 读已提交(read committed)

  • 可重复读取(repeatable read)

  • 可串行化(serializable)

因为阿粉之前看过《MySQL技术内幕》,虽然不是正版的纸质书,只是PDF,但是也是专门的去准备了一下这些内容,还专门的把英文也都记下来了,表示什么意思,

面试官的提问是事务的隔离级别,而阿粉回答的也确实是事务的隔离级别呀,也不是别的呀,阿粉心里就开始纳闷了,这是什么套路?我确定,之前这都是看过的呀。

于是面试官接下来的话让阿粉觉得很尴尬。

面试官:那脏读,虚读,不可重复读,串行化算什么?

阿粉:这是因为事务并发出现的一些问题呀,事务的隔离级别就是为了解决这些问题而出现的。

面试官;你确定是这个样子的?

阿粉:确实是这个样子的呀,你说的这几个确实是事务并发出现的问题,就是为了避免这些问题,才会在SQL规范之中去定义这隔离级别的。

面试官:那就先这样,我们继续下一个问题。

连续问我两次是这个样子的?这就很尴尬了,不知道虽然咱们这面试是相互选择,但是你得好好的说呀,互相交流的过程,但是阿粉毕竟还是想着第一家打过来电话,怎么也得给点面子,开张大吉嘛,于是也没说什么其他的,就继续接下来的面试。

电话面试尴尬2

面试官:我看你们在之前的项目中用过Redis,那么说说Redis吧

阿粉于是就开始回答了:

  1. Redis实际上就是一个非关系型数据库,就是以 Key-Value存储数据。一般很多情况都是当做缓存来处理数据,把数据存入Redis中,查询的时候,直接先去查询Redis。

  2. Redis的Value可以有多种存在形式,比如说字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

  3. Redis一般可以当做数据库,也可以当做缓存,还可以当做消息中间件,我们的项目里面一般都是当做缓存来使用的。

  4. 最后一点就是开始夸Redis哪里比较好,什么纯内存操作啦,性能优越啦,没秒处理十万次读写啦,这些说完了之后就没啥了,只能是开始深挖细崛。

阿粉面试一向都是问什么说什么,从来不给你自己挖坑,不然自己挖了坑自己掉下去岂不是很尴尬,而阿粉需要做的就是回答到重点内容就可以了。

你们使用Redis的时候进行过分区么?Redis的分区方案都有哪些?

呀,来比较正式的了,阿粉终于在心中不diss这面试官了,于是就开始了回答、

阿粉回答:

  • 客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。

  • 代理分区 意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。redis和memcached的一种代理实现就是Twemproxy

  • 查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。

但是分区也是有缺点的,涉及多个key的操作通常不会被支持,而且同时操作多个Key,就不能使用Redis的事物了。

回到了这些内容之后,电话面试就直接告一段落了,于是就发出了现场面试的邀请,说我们是xxx金融,大家千万别误会,不是蚂蚁,也不是京东,就是一个给银行做服务的公司,阿粉于是就从网上差了一下,看着网站挺高大上的,结果去了之后竟然是5个人的小作坊。阿粉继续给大家说现场面试是如何把电话面试我的那个面试官给怼走的。

面试官:那行,明天有时间么?来面试一下!

阿粉听完瞬间不想去了,你这不和我沟通的么?起码的尊重得有把。

于是就有了下面的事情。

现场面试之怼面试官

阿粉于是收到了面试的邮件,邮件上写的是一个社区的名字,于是阿粉去了,结果是一个只有五个人的小作坊,而感觉这个xx金融,却是像是把其中的一小块业务给分出来了,交给外人来做的,而这5个哥们就是被分不出来的那一部分把。

面试官A:你先做个自我介绍吧

阿粉就开始巴拉巴拉的说起了个人的自我介绍,介绍完了之后就开始说项目,于是又扯回了上面的事物的隔离级别的问题,面试官A就是这个第一个面试我的面试官,于是阿粉本来就觉得来了就是走个过场,本身双向选择,我觉得不是特给力了,还和我较真。

阿粉说,在《MySQL技术内幕》在第七章的第六节中说了事物的隔离级别,而你说的这些都应该算是网上的总结,而出现的问题,不代表是它的隔离级别吧。

毕竟遇到这样的面试官,从电话面试开始,连个简单的你好都不会说的,直接就你是xxx,然后就开始的,还真的是不多见。毕竟阿粉已经抱着不想入职的心来了,于是就开始了。

面试官:好,我们不谈这个话题了,换下一个,你对数据库索引了解的多么?

阿粉回答,还行吧,了解一点,不算特别的多,

于是阿粉就开始分析索引了。

  • 普通索引:最基本的索引类型,没有唯一性之类的限制

  • 唯一索引:唯一索引是不允许其中任何两行具有相同索引值的索引。

  • 主键索引:简称为主索引,数据库表中一列或列组合(字段)的值唯一标识表中的每一行。该列称为表的主键。

  • 聚合索引:也称为聚簇索引,在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引, 即如果存在聚集索引,就不能再指定CLUSTERED 关键字。

  • 非聚集索引:也叫非簇索引,在非聚集索引中,数据库表中记录的物理顺序与索引顺序可以不相同。一个表中只能有一个聚集索引,但表中的每一列都可以有自己的非聚集索引。

    面试官:哪些场景下你需要建索引?

  1. 数据表规模不大,就几千行,即使不建索引,查询语句的返回时间也不长,这时建索引的意义就不大。

  2. 假如说商品表里有几百万条商品信息,同时每天会在一个时间点,往其中更新大概十万条左右的商品信息,现在用where语句查询特定商品时(比如where name = ‘XXX’)速度很慢,但是为了提升效率的时候,这时候就可以建索引。

面试官:还有什么其他的场景么?

阿粉心想,这不是成心的刁难我了么,建立的,不建立的,我啥都说了,但是心里吐槽他是个 “XX”,但是也不能说出来呀,于是说没了。

事情的暴雷点出现了,大家一定想知道我是为什么把面试官怼走的,而这个就是就面试重点了,因为刚开始的时候是做了个面试题的,面试题里面有让手写一段代码的,阿粉直接就没写,于是。

你这个题为啥没写呢?

实际上就是一个杨辉三角形的题,阿粉直接来了一句,在开发中不会写这么SB的代码的,于是面试官脸色一变,出去了,就找来了第二个面试官,但是阿粉当时已经不想再继续浪费时间了,剩下的面试都是一些特别基础的,没啥实质内容的,阿粉于是面试完就走了。

Java Geek Tech wechat
欢迎订阅 Java 极客技术,这里分享关于 Java 的一切。