本期是【你好,面试官】系列文章的第20期,持续更新中…。
公号回复"面试笔记"获取小龙秋招笔记,助力N名同学斩获大厂offer。
《你好,面试官》系列目前已经连载20篇了,据说看了这个系列的朋友都拿到了大厂offer~
本期会进行大厂面试 实战模拟。
涉及知识点,Redis、MySQL 索引,HashMap、最左匹配等
本期题改编自 ——2023届春招 阿里速卖通 二面
叮叮叮…
面试官:“你好,我是XX面试官,请问是小龙吗?”
小龙:“您好,面试官,我是小龙”
面试官:“好的,现在有空吗,我们开始面试吧”
小龙:“嗯嗯,准备好啦”
…
other questions
…
面试官:“好,我们快一点过。假如叫你在附近50w的商户中,快速找到离你最近的20家饭店,然后进行展示,你会怎么设计?”
小龙:“这个在以前做项目时完成过类似的功能,最高效快捷的方法就是使用我们的 Redis ,Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。”
面试官:“具体怎样做呢?”
小龙:“如果是使用基本命令行,首先需要我们用GEOADD
将商户的地理经纬度坐标导入,量级过高我们可以使用脚本;然后可以使用 GEOSEARCH命令,不过只要版本6.2才有,它可以在指定范围内进行搜索,并按照与指定点之间的距离排序后返回。”
面试官:“你这样设计会不会有什么问题?第一个,怎样获取到每个商户的具体信息进行展示你还没说明;第二个,你这样查询是直接从你所有坐标库里筛选出最近的某些,但是我有要求是饭店呀。”
面试官:“换句话说,你筛选的最近的几个你怎么知道就是饭店,又或者难道你的商户就只有一种吗?”
独白:“先来个基础方案,让你觉得你很牛逼,再优化完善以下,让你觉得我很牛逼~[手动狗头]”
小龙:“额,这些都可以根据场景灵活设计的。我们可以在设计key value方面做文章,想要查询商户的具体信息,但是考虑Redis是一个内存级数据库,如果将海量商户所有基本信息全部存入,无疑是极大的损失与浪费。”
小龙:“同时要满足不同类型的筛选,那么我们可以以 shop:xx:type 作为 key,商户 id 作为 value。这样就可根据传入的type筛选不同类型,根据经纬度查询进行查询。得到距离排序的商户 ID,再根据其ID去查询商户具体信息。”
面试官:“好的,不错哈。”
面试官:“我看你对 MySQL
挺熟悉的,能说说平时是怎样去设计索引的吗?”
小龙:“设计索引我们一般都是追求用尽可能小的空间去提高查询速度。化繁为简,避免过度设计,大多数情况,用主键ID就可以满足很多场景,如果有更多需求时,才会考虑如何设计优化索引。”
小龙:“索引一般建在where条件,匹配度要高;基数尽量大大,区分度尽量高,不然使用索引和不使用区别就不大啦。同时之前就说啦,空间要尽可能小,因为索引也要占空间,尽量使用短索引,不要过大索引,尽量去扩展,用联合索引,避免更新频繁的场景。”
面试官:“听你说联合索引,那你知道最左匹配原则吗?为什么是最左,而不是最右?”
小龙:“很简单,假如建立联合索引(a,b,c),由于MySQL Innodb引擎底层使用的是B+树作为索引,因此它实际上排序是先根据a排序,a相同时b有序,a不同无序,以此类推。因此,在匹配时也是从左开始匹配才生效。”
面试官:“好的,我也不要你说啥概念。你给我分析一下这里会不会遵循原则。”
面试官:“现在我建立联合索引(a,b,c)”
面试官:“select * from table_xl where c = ‘1’ and b = ‘2’ and a = ‘3’ 会走索引吗? ”
小龙:“肯定啊,这是全值匹配查询,查询优化器会自动优化查询顺序。”
面试官:“select * from table_xl where a = 1 and b > 3 会走索引吗? ”
小龙:" a 相同时 b 是有序的,进行范围查找走的是联合索引,会走 a b 索引 。"
面试官:“好的,HashMap了解吗?说说HashMap是什么时候进行扩容的吗?”
小龙:“OK,首先我们得知道它是在什么时候触发扩容的,第一个众所周知的,当它达到扩容阈值时便会被触发,这个阈值也就是HashMap
中threshold
这个属性,用 capacity(table容量) * loadFactor(负载因子)计算所得。”
小龙:“第二个容易被忽略的点是,HashMap采用的是懒加载,也就是说HashMap
并不是一开始就初始化 table,而是在第一次放入元素时,才会初始化table,也就是调用扩容方法进行初始化的。”
面试官:“好的,能用你的话简单讲一下它的一个大概扩容流程?”
小龙:“好说,其实也就是扩容时,会新建一个2倍大小的数组,根据新数组长度对其值重新hash,寻址。具体会将原来数组链表拆为高低位链表,低位链表存放扩容后数组下标没变的结点,高位链表存放变了的,然后将高低位链表插入新数组。”
面试官:“我看你计算机基础也挺不错,那我问你:A和B进行TCP传输,假如B的网线被拔了,A会怎么做?”
小龙:“这个问题留给评论区的你们?看你们的想法如何?”
本期我们通过面试模拟简单介绍了 Reids
关于 GEO
的相关知识,MySQL索引相关
、HashMap相关
。订阅+星标持续追更
如果你有经典的面试题,可以私信投稿~